Unicode-Unterstützung für Invoke-Sqlcmd in PowerShell

8

Das PowerShell-Modul sqlps bietet Kernunterstützung für den SQL Server-Zugriff von PowerShell und seiner Das Cmdlet Invoke-Sqlcmd ist das wichtigste Arbeitspferd für die Ausführung von Literalabfragen oder SQL-Skriptdateien (analog zur Nicht-PowerShell sqlcmd Dienstprogramm). Ich habe kürzlich einige Experimente versucht, um zu bestätigen, dass Invoke-Sqlcmd Unicode behandelt und einige überraschende Ergebnisse hatte.

Ich begann mit dieser einfachen Skriptdatei (namens unicode.sql):

%Vor%

Beachten Sie, dass der Nachname einige typische Unicode-Zeichen enthält, die beispielsweise in einem deutschen Namen vorkommen können.

Ergebnisse

SQL Server Management Studio: Wird bei der Ausgabe in ein Raster oder in Text korrekt wiedergegeben, z. B.

%Vor%

Dienstprogramm sqlcmd: Rendert korrekt, unabhängig davon, ob es von einer DOS-Shell oder einer PowerShell ausgeführt wird, z. B.

%Vor%

PowerShell Invoke-Sqlcmd: Wird falsch wiedergegeben (egal ob als Text wie unten gezeigt oder in Out-Gridview ausgegeben):

%Vor%

Die MSDN-Dokumentation für Invoke-Sqlcmd erwähnt Unicode nur im Vorbeigehen und vergleicht seine Befehlszeilenoptionen mit denen von sqlcmd, zeigt, dass, während letztere eine -u -Option für die Ausgabe von Unicode hat (was in meinem obigen Experiment nicht einmal benötigt wurde), Invoke-Sqlcmd hat no äquivalenten Parameter.

Ich habe durch umfangreiche Websuche nichts zu diesem Punkt gefunden, aber ich hoffe immer noch, dass dies in gewisser Weise ein Benutzerfehler meinerseits ist. Gibt es eine Möglichkeit, die Eingabedaten beim Abrufen mit Invoke-Sqlcmd in PowerShell zu erhalten?

    
Michael Sorens 10.08.2012, 16:24
quelle

1 Antwort

11

Update Ich habe invoke-sqlcmd auf einem anderen Rechner getestet und es funktioniert, vielleicht ist der Rest nicht anwendbar ...

Update 2 Scheint nur ein Problem mit -inputfile zu haben, wenn die Ausführung über den -Query-Parameter invoke-sqlcmd funktioniert.

Was ich sagen kann, hat etwas mit ADO.NET DataTable zu tun, wenn eine Zeichenkette konvertiert wird. Es funktioniert gut, wenn Sie einen ExecuteScaler oder ExecuteReader verwenden. Das behebt natürlich nicht invoke-sqlcmd, erklärt aber warum:

%Vor%

Update 3 Die Codierung der Datei scheint der Schlüssel zu sein. Wenn Sie [System.IO.File] :: ReadAllText betrachten, gibt das MSDN-Dokument an, dass es nur die UTF-8- oder UTF-32-Codierung erkennt. Ссылка

Wenn ich die .sql-Datei mit UTF-8 speichere, funktioniert der Parameter -inputfile. Sie können UTF-8 auswählen, wenn Sie eine .sql-Datei in SSMS speichern, aber hier ist ein Powershell-Code zum Überprüfen und Ändern der Codierung. Sie müssen Get-FileEncoding.ps1 von Ссылка

herunterladen %Vor%     
Chad Miller 11.08.2012, 01:10
quelle