Sql-Server

數據庫郵件的 CSV 附件編碼不正確

  • February 2, 2021

我有一個生成結果集的過程,我將其作為 CSV 文件附件附加到 sp_sendmail 中。但是,生成的文件編碼為 UCS-2 LE BOM(根據 notepad++)。這會導致生成的文件不會“解析”到列中,而是以列 A 中的所有值打開。如果我將編碼更改為 UTF-8,則它可以正常打開。

問題:

這對我來說很容易解決……但收件人不知道如何做到這一點。我可以更改要生成為 UTF-8 的文件嗎?

用於生成發送郵件的程式碼:

exec msdb.dbo.sp_send_dbmail
           @subject                     = @subject
       ,   @body                        = @message
       ,   @body_format                 = 'html'
       ,   @recipients                  = @recipients_to
       ,   @copy_recipients             = @recipients_cc
       ,   @importance                  = 'High'
       ,   @sensitivity                 = 'Confidential'
       ,   @query                       = N'select * from ##Report'
       ,   @execute_query_database      = @dbName
       ,   @attach_query_result_as_file = 1
       ,   @query_attachment_filename   = @file_name
       ,   @query_result_header         = 1
       ,   @query_result_no_padding     = 1
       ,   @query_result_separator      = ','
       ,   @query_result_width          = 32767;

我建議您使用 powershell 生成附件,然後發送附件:

$reportQuery = "select * from ##Report"
$filePath = "\\aaaa\bbbb\attach.csv"
$mailQuery = "
 EXEC msdb..sp_send_dbmail
 @profile_name = '..',
 @recipients = '..',
 @subject = '..',
 @file_attachments = '" + $filePath + "'",
   ..... (others parameters)

Invoke-Sqlcmd -query $reportQuery | export-csv $filePath -encoding "unicode"
$result = Invoke-Sqlcmd -query $mailQuery

這似乎是該過程如何工作的某種限制,sp_send_dbmail但是您可以嘗試通過此StackOverflow 答案對過程進行一些更改來嘗試解決方法。

**警告:**我不建議更改實際程序本身,而是我會製作您自己的程序副本來工作,以盡量減少對您的實例的沖洗。

此外,只是切線相關,但我發現這篇關於通過 CLR 發送郵件的 RedGate 文章反而很有趣,也許對你有幫助,可以作為替代方案。

引用自:https://dba.stackexchange.com/questions/284545