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のスイッチと比較して、後者には-u
Unicodeを出力するオプションがあることを示しています(上記の実験では必要ありませんでした)、Invoke-Sqlcmd同等のパラメータはありません。
広範囲にわたるWeb検索では、この点に関して何も見つかりませんでしたが、これが何らかの形で私の側のユーザーエラーであると期待しています。PowerShellのInvoke-Sqlcmdを使用して入力データを取得するときに、入力データを保持する方法はありますか?