1

sp_send_dbmail用来生成和发送提供给其他程序的文件。该程序消化“ANSI/ASCII”和“ISO-8859-1”编码。但我不能sp_send_dbmail做一个。

过程调用如下所示

exec msdb.dbo.sp_send_dbmail 
    @profile_name= @profile_name, 
    @recipients  = @recipients,
    @body = @body,
    @subject = @subject,
    @attach_query_result_as_file = 1, 
    @query_result_header = 0,
    @query_result_no_padding = 1,
    @query = @query,
    @query_attachment_filename = @fname,
    @query_result_width = 4000,
    @mailitem_id = @mailitem_id OUTPUT

因此,附件是根据传递的查询结果创建的。但是由于某种原因实际附加到邮件的结果文件是使用 UCS2 Little Endian 编码的。有没有办法改变它?

4

1 回答 1

4

Found workaround that allow to switch between UTF/ANSI. In order to do that you need to modify sp_send_dbmail like that:

  1. Add new parameter to procedure somemthing like @ANSI_Attachment BIT = 0
  2. Replace piece of its code IF(@AttachmentsExist = 1) BEGIN ....... END with

`IF (@AttachmentsExist = 1)

BEGIN
    if (@ANSI_Attachment = 1) 
    begin
        --Copy temp attachments to sysmail_attachments      
        INSERT INTO sysmail_attachments(mailitem_id, filename, filesize, attachment)
        SELECT @mailitem_id, filename, filesize, 
                convert(varbinary(max), 
                    substring( -- remove BOM mark from unicode
                        convert(varchar(max), CONVERT (nvarchar(max), attachment)), 
                        2, DATALENGTH(attachment)/2
                    )
                )
        FROM sysmail_attachments_transfer
        WHERE uid = @temp_table_uid
    end else begin
        --Copy temp attachments to sysmail_attachments      
        INSERT INTO sysmail_attachments(mailitem_id, filename, filesize, attachment)
        SELECT @mailitem_id, filename, filesize, attachment
        FROM sysmail_attachments_transfer
        WHERE uid = @temp_table_uid
    end
END `

This does the same but if in procedure call @ANSI_Attachment = 1 is used it removes unicode BOM mark before sending.

Peeked that solution here

于 2013-04-10T06:35:22.473 回答