PowerShell sqlps module为PowerShell中的SQL Server访问提供核心支持,其Invoke-Sqlcmd cmdlet是执行文字查询或SQL脚本文件的主要工具(类似于非PowerShell {{3 }} 效用)。我最近尝试了一些实验来确认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 utility:正确呈现是从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的sqlcmd仅在传递时提及Unicode,将其命令行开关与sqlcmd的命令行开关进行比较,显示虽然后者有-u
选项用于输出Unicode(不是甚至在我上面的实验中需要),Invoke-Sqlcmd有 no 等效参数。
我通过广泛的网络搜索找不到关于这一点的任何内容,但我仍然希望这在某种程度上是我的用户错误。在PowerShell中使用Invoke-Sqlcmd检索输入数据时,有没有办法保留输入数据?
答案 0 :(得分:14)
更新我在另一台计算机上测试了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文档声明它只会检测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
答案 1 :(得分:0)
执行 SQLCMD 时,必须指定编码。
EXEC xp_cmdshell 'for %f in ("{Dir}*.sql") do sqlcmd -S {Server} -U {username} -P {password} -d {database} -i "%f" -b -f 65001'