11

PowerShell sqlpsモジュールは、PowerShell内からのSQL Serverアクセス​​のコアサポートを提供し、そのInvoke-Sqlcmdコマンドレットは、リテラルクエリまたは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シェルまたは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のスイッチと比較して、後者には-uUnicodeを出力するオプションがあることを示しています(上記の実験では必要ありませんでした)、Invoke-Sqlcmd同等のパラメータはありません。

広範囲にわたるWeb検索では、この点に関して何も見つかりませんでしたが、これが何らかの形で私の側のユーザーエラーであると期待しています。PowerShellのInvoke-Sqlcmdを使用して入力データを取得するときに、入力データを保持する方法はありますか?

4

2 に答える 2

16

アップデート私は別のマシンでinvoke-sqlcmdをテストしましたが、それは機能するので、これ以外の部分は当てはまらないかもしれません...

Update 2 -Queryパラメーターinvoke-sqlcmdを介して実行すると、-inputfileでのみ問題が発生するようです。

私が知る限り、これは文字列を変換するときのADO.NETDataTableと関係があります。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

.sqlファイルをUTF-8で保存すると、-inputfileparamを使用できます。.sqlファイルをSSMSに保存するときに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
于 2012-08-11T01:10:24.440 に答える
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 '

于 2021-01-23T22:21:34.680 に答える