有没有办法强制 sp_send_dbmail 使用 ANSI,或者不包含 Unicode 前缀?

Jon*_*des 5 sql-server-2008 database-mail

这是非常微不足道的,但如果有人手头有答案,我会很感激。

我使用msdb..sp_send_dbmail存储过程作为分发简单报告的轻量级方法。这通常需要生成 CSV。但是,存储过程包括 Unicode little-endian 前缀 FF FE。这会混淆 Excel,导致它不会自动将 CSV 解析为列。

有许多变通方法:使用真正的报告平台(我们有 Crystal,但它从来没有可靠地工作过);将文件发送到一个小应用程序,该应用程序将文件转换为 ANSI 并继续发送;使用制表符分隔符(我最喜欢的);或教育收件人如何使用 CSV(开个玩笑,我们都知道这是不可能的)。

但是,我很想在某处拨动一个开关并告诉 SQL Server 停止将附件创建为 Unicode,因为我没有这样的需要。我还没有找到这样的设置;这可能吗?

谢谢!


编辑

根据 Rohan 的回答,SQL 代理作业步骤中的这个脚本几乎可以工作:

$reportQuery = "EXEC Routine..TopTenReviewsReport @DoNotLog = 1"
$filePath = "\\SQLBI001\RawData\TopTenReviewsReport.csv"
$mailQuery = "
  EXEC msdb..sp_send_dbmail
  @profile_name = 'X',
  @recipients = 'X',
  @subject = 'X',
  @file_attachments = '" + $filePath + "'"

Invoke-Sqlcmd -query $reportQuery | export-csv $filePath
$result = Invoke-Sqlcmd -query $mailQuery
Run Code Online (Sandbox Code Playgroud)

该文件现在有一个“#TYPE System.Data.DataRow”前缀,而不是 0xFF FE,但它现在是 ANSI,所以就是这样。

Wri*_*ree 2

我认为你可以使用powershell生成报告,然后使用DBMail邮寄附件

Write-host "Running SQL Query to export to ANSI CSV file"
Invoke-Sqlcmd -Query $dbQuery -ServerInstance $instanceName | export-csv $targetFileAnsi
Write-host "Running SQL Query to export to Unicode CSV file"
Invoke-Sqlcmd -Query $dbQuery -ServerInstance $instanceName | export-csv $targetFileUnicode -encoding "unicode"


$dbMailQuery1 = "execute msdb..sp_send_dbmail 
@profile_name = 'msft_profile', 
@recipients = 'seths@microsoft.com', 
@subject = 'Email with Attachment - ANSI attachment', 
@body_format = 'TEXT', 
@body = 'This email has ANSI file attached to it', 
@file_attachments = 'c:\temp\result_ansi.csv' "
Run Code Online (Sandbox Code Playgroud)

来源:链接