[英]Unicode support for Invoke-Sqlcmd in PowerShell
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 的命令行開關進行了比較,表明雖然后者有一個用於輸出 Unicode 的-u
選項(在我上面的實驗中甚至不需要),但 Invoke -Sqlcmd沒有等效參數。
通過廣泛的網絡搜索,我在這一點上一無所獲,但我仍然希望這在某種程度上是我的用戶錯誤。 在 PowerShell 中使用 Invoke-Sqlcmd 檢索輸入數據時,有沒有辦法保留輸入數據?
更新我在另一台機器上測試了 invoke-sqlcmd 並且它可以工作,所以可能其余部分不適用......
更新 2只有在通過 -Query 參數 invoke-sqlcmd 執行時似乎與 -inputfile 有問題。
據我所知,這與轉換字符串時的 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
執行 SQLCMD 時,必須指定編碼。
EXEC xp_cmdshell 'for %f in ("{Dir}*.sql") do sqlcmd -S {Server} -U {username} -P {password} -d {database} -i "%f" -b -f 65001 '
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.