Поддержка Unicode для Invoke-Sqlcmd в PowerShell

PowerShell модуль sqlps обеспечивает основную поддержку доступа SQL Server из PowerShell и его Invoke-Sqlcmd командлет является его главной рабочей лошадкой для выполнения литеральных запросов или файлов сценариев SQL (аналогично не-PowerShell sqlcmd утилиты). Недавно я попробовал некоторые эксперименты, чтобы подтвердить, что Invoke-Sqlcmd обрабатывает 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;

обратите внимание, что фамилия имеет некоторые типичные символы Юникода, которые можно найти в немецком имени, например.


результаты

среда 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

на документация MSDN for Invoke-Sqlcmd упоминает Unicode только попутно, сравнивая его коммутаторы командной строки с коммутаторами sqlcmd, показывая, что, хотя последний имеет -u опция для вывода Unicode (которая даже не была нужна в моем эксперименте выше), Invoke-Sqlcmd имеет нет эквивалентный параметр.

I не нашли ничего вообще относительно этого момента через обширный веб-поиск, но я все еще надеюсь, что это в некотором роде ошибка пользователя с моей стороны. Есть ли способ сохранить входные данные при их получении с помощью Invoke-Sqlcmd в PowerShell?

1 ответов


обновление Я тестировал invoke-sqlcmd на другой машине, и он работает, поэтому, возможно, остальная часть этого не применяется...

обновление 2 только кажется, что проблема с -inputfile при выполнении через-Query параметр 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.ИО.File]:: ReadAllText, документ MSDN заявляет, что он будет обнаруживать только кодировку UTF-8 или UTF-32. http://msdn.microsoft.com/en-us/library/ms143369 (v=против 90).aspx

Если я сохраню .sql файл с UTF-8, используя-inputfile param работает. Вы можете выбрать UTF-8 при сохранении .sql-файл в SSMS, но вот код Powershell для проверки и изменения кодировка тоже. Вам нужно будет захватить Get-FileEncoding.ps1 от http://poshcode.org/2075

. .\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