PowerShell sqlps 模块为从 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 文档仅顺便提及 Unicode,将其命令行开关与 sqlcmd 的命令行开关进行比较,表明虽然后者有-u
输出 Unicode 的选项(在我上面的实验中甚至不需要),但 Invoke-Sqlcmd没有等效参数。
通过广泛的网络搜索,我没有发现任何关于这一点的信息,但我仍然希望这在某种程度上是我的用户错误。在 PowerShell 中使用 Invoke-Sqlcmd 检索输入数据时,有没有办法保留输入数据?