【发布时间】:2012-08-07 23:46:58
【问题描述】:
PowerShell sqlps module 为从 PowerShell 中访问 SQL Server 提供核心支持,其 Invoke-Sqlcmd cmdlet 是其执行文字查询或 SQL 脚本文件的主要主力(类似于非 PowerShell sqlcmd 实用程序)。我最近尝试了一些实验来确认 Invoke-Sqlcmd 处理 Unicode 并且有一些令人惊讶的结果。
我从这个简单的脚本文件(名为 unicode.sql)开始:
CREATE TABLE #customers
( [IdCust] int,
[FirstName] nvarchar(25),
[SurName] nvarchar(25)
);
INSERT INTO #customers VALUES (4, N'Hans', N'Grüßner')
SELECT * FROM #customers;
DROP TABLE #customers;
请注意,姓氏包含一些典型的 Unicode 字符,例如,您可能会在德语名称中找到这些字符。
结果
SQL Server Management Studio:在输出到网格或文本时正确呈现,例如
IdCust FirstName Surname
----------- ------------------------- -------------------------
4 Hans Grüßner
sqlcmd 实用程序:无论是从 DOS shell 还是 PowerShell 运行,都可以正确呈现,例如
C:\> sqlcmd -S .\SQLEXPRESS -i unicode.sql
IdCust FirstName Surname
----------- ------------------------- -------------------------
4 Hans Grüßner
PowerShell Invoke-Sqlcmd:呈现不正确(无论是输出为如下所示的文本还是通过管道传输到 Out-Gridview):
PS> Invoke-Sqlcmd -Server .\sqlexpress -InputFile unicode.sql
IdCust FirstName Surname
------ --------- -------
4 Hans Gr??ner
Invoke-Sqlcmd 的MSDN documentation 只是顺便提到了 Unicode,将其命令行开关与 sqlcmd 的开关进行比较,表明后者有一个用于输出 Unicode 的-u 选项(在我的上面的实验),Invoke-Sqlcmd 有 no 等效参数。
通过广泛的网络搜索,我没有发现任何关于这一点的信息,但我仍然希望这在某种程度上是我的用户错误。在 PowerShell 中使用 Invoke-Sqlcmd 检索输入数据时,有没有办法保留输入数据?
【问题讨论】:
-
我认为您应该更改您正在使用的 SQL Server 的字符编码。
-
你的 $OutputEncoding 的 Powershell 设置是什么?有趣的问题,我期待有时间来测试一下。
-
$OutputEncoding 设置为 US-ASCII。我只是尝试将其设置为
[Text.Encoding]::Unicode,然后设置为[Text.Encoding]::utf8,但在这两种情况下都没有改变结果。
标签: sql-server powershell unicode sqlcmd