Ich kann ganz einfach Daten in eine Textdatei wie:
sqlcmd -S myServer -d myDB -E -Q "select col1, col2, col3 from SomeTable"
-o "MyData.txt"
Ich habe mir jedoch die Hilfedateien angesehen, SQLCMD
aber keine Option speziell für CSV gesehen.
Gibt es eine Möglichkeit, Daten aus einer Tabelle mit in eine CSV-Textdatei zu kopieren SQLCMD
?
sql-server
file
csv
sqlcmd
Strahl
quelle
quelle
Antworten:
Sie können so etwas ausführen:
-h-1
Entfernt Spaltennamenüberschriften aus dem Ergebnis-s","
setzt den Säulentrenner auf,-w 700
Legt die Zeilenbreite auf 700 Zeichen fest (diese muss so breit sein wie die längste Zeile, sonst wird in die nächste Zeile umgebrochen).quelle
'""' + col1 + '""' AS col1
in (doppelte) doppelte Anführungszeichen setzen oder einfach eine gespeicherte Prozedur aufrufen.Mit PowerShell können Sie das Problem sauber lösen, indem Sie Invoke-Sqlcmd in Export-Csv leiten.
SQL Server 2016 enthält das SqlServer- Modul, das das
Invoke-Sqlcmd
Cmdlet enthält , das Sie auch dann haben, wenn Sie nur SSMS 2016 installieren. Zuvor enthielt SQL Server 2012 das alte SQLPS- Modul , das das aktuelle Verzeichnis inSQLSERVER:\
den Stand des Moduls ändern würde zuerst verwendet (unter anderen Fehlern), daher müssen Sie die#Requires
obige Zeile ändern in:Um das Beispiel für SQL Server 2008 und 2008 R2 anzupassen, entfernen Sie die
#Requires
Zeile vollständig und verwenden Sie das Dienstprogramm sqlps.exe anstelle des Standard-PowerShell-Hosts.Invoke-Sqlcmd ist das PowerShell-Äquivalent von sqlcmd.exe. Anstelle von Text werden System.Data.DataRow- Objekte ausgegeben .
Der
-Query
Parameter funktioniert wie der-Q
Parameter von sqlcmd.exe. Übergeben Sie eine SQL-Abfrage, die die Daten beschreibt, die Sie exportieren möchten.Der
-Database
Parameter funktioniert wie der-d
Parameter von sqlcmd.exe. Übergeben Sie ihm den Namen der Datenbank, die die zu exportierenden Daten enthält.Der
-Server
Parameter funktioniert wie der-S
Parameter von sqlcmd.exe. Übergeben Sie ihm den Namen des Servers, der die zu exportierenden Daten enthält.Export-CSV ist ein PowerShell-Cmdlet, das generische Objekte in CSV serialisiert. Es wird mit PowerShell geliefert.
Der
-NoTypeInformation
Parameter unterdrückt zusätzliche Ausgaben, die nicht Teil des CSV-Formats sind. Standardmäßig schreibt das Cmdlet einen Header mit Typinformationen. Es informiert Sie über den Typ des Objekts, wenn Sie es später mit deserialisierenImport-Csv
, verwirrt jedoch Tools, die eine Standard-CSV erwarten.Der
-Path
Parameter funktioniert wie der-o
Parameter von sqlcmd.exe. Ein vollständiger Pfad für diesen Wert ist am sichersten, wenn Sie das alte SQLPS- Modul nicht mehr verwenden können.Der
-Encoding
Parameter funktioniert wie die Parameter-f
oder-u
von sqlcmd.exe. Standardmäßig gibt Export-Csv nur ASCII-Zeichen aus und ersetzt alle anderen durch Fragezeichen. Verwenden Sie stattdessen UTF8, um alle Zeichen beizubehalten und mit den meisten anderen Tools kompatibel zu bleiben.Der Hauptvorteil dieser Lösung gegenüber sqlcmd.exe oder bcp.exe besteht darin, dass Sie den Befehl nicht hacken müssen, um eine gültige CSV auszugeben. Das Cmdlet Export-Csv erledigt alles für Sie.
Der Hauptnachteil besteht darin, dass
Invoke-Sqlcmd
die gesamte Ergebnismenge gelesen wird, bevor sie entlang der Pipeline geleitet wird. Stellen Sie sicher, dass Sie über genügend Speicher für die gesamte Ergebnismenge verfügen, die Sie exportieren möchten.Es funktioniert möglicherweise nicht reibungslos für Milliarden von Zeilen. Wenn das ein Problem ist, können Sie die anderen Tools versuchen oder eine eigene effiziente Version rollen von
Invoke-Sqlcmd
mit System.Data.SqlClient.SqlDataReader Klasse.quelle
Die letzte Zeile enthält CSV-spezifische Optionen.
-W
Entfernen Sie nachgestellte Leerzeichen aus jedem einzelnen Feld-s","
setzt den Spaltenseparator auf das Komma (,)-w 999
Legt die Zeilenbreite auf 999 Zeichen festDie Antwort von scottm kommt meiner Verwendung sehr nahe, aber ich finde
-W
, dass dies eine wirklich schöne Ergänzung ist: Ich muss keine Leerzeichen kürzen, wenn ich die CSV an anderer Stelle verwende.Siehe auch die MSDN sqlcmd-Referenz . Es
/?
beschämt die Ausgabe der Option.quelle
'""' + col1 + '""' AS col1
umgehen, in (doppelte) doppelte Anführungszeichen setzen oder einfach eine gespeicherte Prozedur aufrufen.Ist das nicht
bcp
gedacht?Führen Sie dies über Ihre Befehlszeile aus, um die Syntax zu überprüfen.
Beispielsweise:
Bitte beachten Sie, dass
bcp
keine Spaltenüberschriften ausgegeben werden können.Siehe: bcp Utility- Dokumentenseite.
Beispiel von der obigen Seite:
quelle
bcp
enthält keinen Header (Spaltennamen), ist aber ~ 10X schneller alssqlcmd
(meiner Erfahrung nach). Für wirklich große Datenmengen können Siebcp
die Daten abrufen und mitsqlcmd
(wählen Sie oben 0 * aus ...) den Header abrufen und dann kombinieren.Ein Hinweis für alle, die dies tun möchten, aber auch die Spaltenüberschriften haben. Dies ist die Lösung, für die ich eine Batch-Datei verwendet habe:
Dadurch werden die ersten Ergebnisse (einschließlich der Trennzeichen ----, ---- zwischen den Headern und den Daten) in eine temporäre Datei ausgegeben und diese Zeile durch Herausfiltern über findstr entfernt. Beachten Sie, dass es nicht perfekt ist, da es herausfiltert
-,-
- es funktioniert nicht, wenn nur eine Spalte in der Ausgabe enthalten ist, und es filtert auch legitime Zeilen heraus, die diese Zeichenfolge enthalten.quelle
Diese Antwort baut auf der Lösung von @ iain-Elder auf, die bis auf den Fall einer großen Datenbank (wie in seiner Lösung ausgeführt) gut funktioniert. Die gesamte Tabelle muss in den Speicher Ihres Systems passen, und für mich war dies keine Option. Ich vermute, dass die beste Lösung den System.Data.SqlClient.SqlDataReader und einen benutzerdefinierten CSV-Serializer ( siehe hier für ein Beispiel ) oder eine andere Sprache mit einem MS SQL-Treiber und einer CSV-Serialisierung verwenden würde. Im Geiste der ursprünglichen Frage, die wahrscheinlich nach einer Lösung ohne Abhängigkeit suchte, funktionierte der folgende PowerShell-Code für mich. Es ist sehr langsam und ineffizient, insbesondere beim Instanziieren des $ data-Arrays und beim Aufrufen von Export-Csv im Append-Modus für jede $ chunk_size-Zeile.
quelle
Alternative Option mit BCP:
quelle
Wird normalerweise
sqlcmd
mit einembcp
Dienstprogramm (als Teil vonmssql-tools
) geliefert, das standardmäßig in CSV exportiert wird.Verwendung:
Beispielsweise:
Um alle Tabellen in entsprechende CSV-Dateien zu speichern, finden Sie hier das Bash- Skript:
quelle
Eine Antwort oben hat es für mich fast gelöst, aber es erstellt keine richtig analysierte CSV.
Hier ist meine Version:
Jemand, der sagt, dass dies
sqlcmd
zugunsten einer PowerShell-Alternative veraltet ist, vergisst, dass diessqlcmd
nicht nur für Windows gilt. Ich bin unter Linux (und unter Windows vermeide ich PS sowieso).Trotzdem finde ich es
bcp
einfacher.quelle
Aus folgenden zwei Gründen sollten Sie meine Lösung in CMD ausführen:
Der Anmeldename und das Kennwort sind manchmal erforderlich, um eine Remote-SQL Server-Instanz abzufragen
quelle
Sie können es auf hackige Weise tun. Vorsichtig mit dem
sqlcmd
Hack. Wenn die Daten doppelte Anführungszeichen oder Kommas enthalten, treten Probleme auf.Sie können ein einfaches Skript verwenden, um es richtig zu machen:
Quelle: Schreiben der SQL-Ausgabe in CSV mit VBScript .
quelle
sqlcmd
, wir haben nur die Tatsache angegeben, dasssqlcmd
das Komma nicht richtig entweicht und daher für ernsthafte CSV-Ausgaben kaum verwendbar ist .