sql-server – PowerShell中对Invoke-Sqlcmd的Unicode支持

前端之家收集整理的这篇文章主要介绍了sql-server – PowerShell中对Invoke-Sqlcmd的Unicode支持前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Power Shell 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选项(在我上面的实验中甚至不需要),但是调用sqlcmd没有等效参数.

通过广泛的网络搜索我没有发现任何关于这一点,但我仍然希望这在某种程度上是我的用户错误.在PowerShell中使用Invoke-sqlcmd检索输入数据时,有没有办法保留输入数据?

解决方法

更新我在另一台机器上测试了invoke-sqlcmd并且它可以工作,所以其余的可能不适用…

更新2在执行通过-Query参数时,似乎只有-inputfile问题invoke-sqlcmd工作正常.

据我所知,这与转换字符串时ADO.NET DataTable有关.使用ExecuteScaler或ExecuteReader时,它可以正常工作.当然这不会修复invoke-sqlcmd,但确实解释了原因:

$server = "$env:computername\sql1"
$database = "tempdb"
$query = @"
CREATE TABLE #customers

(     [SurName] nvarchar(25)
);
INSERT INTO #customers VALUES (N'Grüßner')
SELECT * FROM #customers;
"@


$connection=new-object System.Data.sqlClient.sqlConnection
$connection.ConnectionString="Server={0};Database={1};Integrated Security=True" -f $server,$database
$command=new-object system.Data.sqlClient.sqlCommand($query,$connection)
$connection.Open()
$command.ExecuteScalar()
$connection.Close()

更新3
文件的编码似乎是关键.查看[System.IO.File] :: ReadAllText,MSDN doc声明它只会检测UTF-8或UTF-32编码. http://msdn.microsoft.com/en-us/library/ms143369(v=vs.90).aspx

如果我使用UTF-8保存.sql文件,则使用-inputfile参数可以正常工作.在SSMS中保存.sql文件时可以选择UTF-8,但这里有一些Powershell代码来检查和更改编码.您需要从http://poshcode.org/2075获取Get-FileEncoding.ps1

. .\Get-FileEncoding.ps1 
Get-FileEncoding -Path E:\bin\unicode.sql

$query = get-content E:\bin\unicode.sql
$query= $query -join "`n"
$query | Out-File -FilePath e:\bin\unicode.sql -Encoding UTF8 -force

Get-FileEncoding -Path E:\bin\unicode.sql

猜你在找的MsSQL相关文章