sp_send_dbmail attach files stored as varbinary in database

后端 未结 1 1604
深忆病人
深忆病人 2021-01-19 01:20

I have a two part question relating to sending query results as attachments using sp_send_dbmail.

Problem 1: Only basic .txt files will open. Any o

相关标签:
1条回答
  • 2021-01-19 01:49

    I don't think your going to be able to send binary data directly from SQL. There are a few posts out there that talk about this same issue. From the Microsoft documentation a text return to the query is formatted as a text file. Binary is formatted as a hexadecimal. Which as you have pointed out corrupts any file that isn't a text document.

    I think you could still accomplish what you're trying to do however by first using BCP to export the binary data out to the file system, and then importing it back in via traditional file attachment methods made available to sendmail.

    So something like this. (concept only - untested code)

    DECLARE @OutputFileAndPath VarChar(500) = '\\Log_Files\MyFile.pdf ' 
    DECLARE @sql VarChar(8000)
    
    SELECT @sql = 'BCP "SELECT MyFile FROM [dbo].[MyTable] 
        WHERE PrimaryKey = 12345" queryout ' + @OutputFileAndPath +
            ' -S MyServer\MyInstance -T -fC:\Documents.fmt'
    
    /* you could use a generic format file that would cover most formats */
    
    EXEC xp_cmdshell @sql, NO_OUTPUT;
    
    while ( (select count(MassEmailID) from MassEmail where status = 20 )>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
    
    
        exec msdb.dbo.sp_send_dbmail    
            @profile_name = 'MASS_EMAIL',
            @recipients = 'me@myemail.com',
            @subject = @Subject,
            @body =@Body,
            @body_format ='HTML',
            @file_attachments = @OutputFileAndPath /* i.e. \\Log_Files\MyFile.pdf */
    
        update MassEmailset status= 30,SendDate = GetDate() where MassEmailID = @MassEmailID
    end     
    
    0 讨论(0)
提交回复
热议问题