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文档仅在比较其命令行开关与sqlcmd时才简单提到Unicode,表明后者具有用于输出Unicode的-u
选项(甚至在我的实验中不需要),而Invoke-Sqlcmd没有等效的参数。
我通过广泛的网络搜索没有找到任何关于此点的信息,但我仍然希望这在某种程度上是我的用户错误。在PowerShell中使用Invoke-Sqlcmd检索输入数据时是否有保留数据的方法?
[Text.Encoding]::Unicode
和[Text.Encoding]::utf8
,但两种情况下结果都没有改变。 - Michael Sorens