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

时间:2013-04-10 05:26:57

标签: 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

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

1 个答案:

答案 0 :(得分:4)

找到允许在UTF / ANSI之间切换的解决方法。 为此,您需要像这样修改sp_send_dbmail

  1. 向过程添加新参数,例如@ANSI_Attachment BIT = 0
  2. 替换其代码段IF(@AttachmentsExist = 1) BEGIN ....... END
  3. `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 `
    

    这样做相同,但如果在程序中调用@ANSI_Attachment = 1,它会在发送之前删除unicode BOM标记。

    偷看解决方案here

相关问题