如何更改sp_send_dbmail查询的附件编码?

Pau*_*jto 1 sql email encoding sp-send-dbmail

我用来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
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*jto 5

找到允许在 UTF/ANSI 之间切换的解决方法。为了做到这一点,你需要sp_send_dbmail这样修改:

  1. 添加新参数到程序中,例如@ANSI_Attachment BIT = 0
  2. 将其代码片段替换IF(@AttachmentsExist = 1) BEGIN ....... END

`如果(@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 `
Run Code Online (Sandbox Code Playgroud)

其作用相同,但如果在过程调用中使用 @ANSI_Attachment = 1,它将在发送之前删除 unicode BOM 标记。

在这里查看了该解决方案