. Модуль PowerShell sqlps обеспечивает базовую поддержку доступа к SQL Server из PowerShell, а его командлет 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:Отображает правильно при выводе в сетку или в текст, например.
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 -Sqlcmd:Неправильно отображается (независимо от того, выводится ли он в виде текста, как показано ниже, или передается в Out -Gridview):
PS> Invoke-Sqlcmd -Server.\sqlexpress -InputFile unicode.sql
IdCust FirstName Surname
------ --------- -------
4 Hans Gr??ner
Документация MSDN для Invoke -Sqlcmd упоминает Unicode лишь вскользь, сравнивая его командные -переключатели строк с переключателями строк sqlcmd, показывая, что хотя последний имеет параметр -u
для вывода Unicode (, который даже не был нужен в моем эксперименте выше ), Invoke -Sqlcmd не имеет нет эквивалентного параметра.
Я ничего не нашел по этому вопросу в результате обширного поиска в Интернете, но я все еще надеюсь, что это в некотором роде ошибка пользователя с моей стороны. Есть ли способ сохранить входные данные при их извлечении с помощью Invoke -Sqlcmd в PowerShell?