Поддержка 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