簡體   English   中英

PowerShell 中對 Invoke-Sqlcmd 的 Unicode 支持

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM