在SQL Server中使用带有特殊字符的sqlcmd将数据导出到csv文件

问题描述

在使用SQL查询使用CSV将表中的数据导出为sqlCMD文件格式时遇到问题。问题在于包含特殊字符(例如摄氏度(°)或®的数据。输出将被转换为另一个值,例如ø。请找到我正在使用的以下查询字符串。

EXEC xp_cmdshell 'sqlcmd -s,-W -Q "set nocount on; select * from ##XMLData_Output ORDER BY SKU_NUMBER" | findstr /v /c:"-" /b > "c:\Scripts\PED_Attributes.csv"'

## XMLData_Output中的数据为

enter image description here

导出数据后,输出文件看起来像

enter image description here

是否有一种方法可以完全像输入数据一样获取csv中的输出?我尝试使用多个选项,例如添加-f 65001,但没有运气。我使用sqlCMD是因为我需要将列名与数据一起导出。如果我们可以在sqlCMD解决此问题,那就太好了。如果我们还有另一种选择,可以通过诸如csv之类的其他方式将数据从sql Server导出到bcp,那也很好。请帮助我解决此问题。任何帮助将不胜感激。

解决方法

您可以将-f参数添加到对sqlcmd的调用中,以指定用于输入和输出的代码页。

它的语法是

-f codepage | i:codepage[,o:codepage] | o:codepage[,i:codepage]

例如:

EXEC xp_cmdshell 'sqlcmd -s,-W -f 1252 -Q "set nocount on; select * from ##XMLData_Output ORDER BY SKU_NUMBER" | findstr /v /c:"-" /b > "c:\Scripts\PED_Attributes.csv"'

EXEC xp_cmdshell 'sqlcmd -s,-W -f o:65001 -Q "set nocount on; select * from ##XMLData_Output ORDER BY SKU_NUMBER" | findstr /v /c:"-" /b > "c:\Scripts\PED_Attributes.csv"'

(请参见https://docs.microsoft.com/en-us/sql/tools/sqlcmd-utility?view=sql-server-ver15上的sqlcmd doc和https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers上的代码页列表)