2013-04-10 88 views
0

我使用sp_send_dbmail來生成併發送送入其他程序的文件。該程序消化「ANSI/ASCII」和「ISO-8859-1」編碼。但我無法獲得sp_send_dbmail如何更改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進行編碼。 有沒有辦法改變它?

+0

的可能重複的[SP \ _send \ _dbmail失敗並作爲附加文件的查詢結果從作業執行(http://stackoverflow.com/questions/15112849/sp-send-dbmail-執行-從在職失敗與 - 查詢結果 - 連接 - 如文件) – EdChum 2013-04-11 07:53:17

回答

3

找到了允許在UTF/ANSI之間切換的解決方法。 爲了做到這一點,你需要修改sp_send_dbmail這樣的:

  1. 新參數的程序somemthing加入像@ANSI_Attachment BIT = 0

'IF(@AttachmentsExist IF(@AttachmentsExist = 1) BEGIN ....... END 更換一塊它的代碼= 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