title: sp_send_dbmail attach files stored as varbinary in database
body: <p>I have a two part question relating to sending query results as attachments using sp_send_dbmail. </p>
  
  <p><strong>Problem 1:</strong> Only basic .txt files will open. Any other format like .pdf or .jpg are corrupted.</p>
  
  <p><strong>Problem 2:</strong> When attempting to send multiple attachments, I receive one file with all file names glued together. </p>
  
  <p>I'm running SQL Server 2005 and I have a table storing uploaded documents:</p>
  
  <pre><code>CREATE TABLE [dbo].[EmailAttachment](
  [EmailAttachmentID] [int] IDENTITY(1,1) NOT NULL,
  [MassEmailID] [int] NULL, -- foreign key
  [FileData] [varbinary](max) NOT NULL,
  [FileName] [varchar](100) NOT NULL,
  [MimeType] [varchar](100) NOT NULL
  </code></pre>
  
  <p>I also have a MassEmail table with standard email stuff. Here is the SQL Send Mail script. For brevity, I've excluded declare statements. </p>
  
  <pre><code>while ( (select count(MassEmailID) from MassEmail where status = 20 )&gt;0) 
  begin
      select @MassEmailID = Min(MassEmailID) from MassEmail where status = 20
      select @Subject = [Subject] from MassEmail where MassEmailID = @MassEmailID
      select @Body = Body from MassEmail where MassEmailID = @MassEmailID
  
      set @query = 'set nocount on; select cast(FileData as varchar(max)) from Mydatabase.dbo.EmailAttachment where MassEmailID = '+ CAST(@MassEmailID as varchar(100))  
  
      select  @filename = ''
      select  @filename = COALESCE(@filename+ ',', '') +FileName from EmailAttachment where MassEmailID = @MassEmailID
  
  exec msdb.dbo.sp_send_dbmail    
      @profile_name = 'MASS_EMAIL',
      @recipients = 'me@myemail.com',
      @subject = @Subject,
      @body =@Body,
      @body_format ='HTML',
      @query = @query,
      @query_attachment_filename = @filename,
      @attach_query_result_as_file = 1,
      @query_result_separator = '; ',
      @query_no_truncate = 1,
      @query_result_header = 0;
  
  update MassEmailset status= 30,SendDate = GetDate() where MassEmailID = @MassEmailID
  end   
  </code></pre>
  
  <p>I am able to successfully read files from the database so I know the binary data is not corrupted.  </p>
  
  <p>.txt files only read when I cast FilaData to varchar. But clearly original headers are lost. It's also worth noting that attachment file sizes are different than the original files. That is most likely due to improper encoding as well. So I'm hoping there's a way to create file headers using the stored mimetype, or some way to include file headers in the binary data?</p>
  
  <p>I'm also not confident in the values of the last few parameters, and I know coalesce is not quite right, because it prepends the first file name with a comma. But good documentation is nearly impossible to find. Please help!</p>