Ich habe eine Abfrage, die ich in SQL Server Management Studio ausführe (Verbindung zu einer SQL Server 2005-Datenbank herstellen). Ich möchte die Daten im CSV-Format exportieren. Nicht das Möchtegern-CSV-Format, bei dem Sie nur ein Komma zwischen die einzelnen Spalten setzen, sondern das "echte" CSV-Format, bei dem Sie Ihre Zeichenfolgen in Anführungszeichen setzen. Auf diese Weise können Sie Daten exportieren, die Kommas oder Anführungszeichen enthalten.
Alle Beispiele, die ich sehe, beschränken sich auf das Möchtegernformat. Ich kann nicht herausfinden, wo die Option zum Zitieren von Zeichenfolgen liegt.
Wenn SSMS zu dieser grundlegenden Leistung wirklich nicht in der Lage ist, gibt es andere Tools, die dies problemlos tun? Ich möchte nicht jedes Mal ein C # -Programm schreiben müssen, wenn ich einen Datendump benötige.
quelle
Antworten:
In SSMS 2012 gibt es hierfür eine Option: Unter Extras -> Optionen -> Abfrageergebnisse -> SQL Server -> Ergebnisse in Raster heißt sie "Anführungszeichenfolgen mit Listentrennzeichen beim Speichern von CSV-Ergebnissen". Ich weiß nicht, wie lange es eine solche Option gibt, aber ich bin verblüfft über zwei Dinge:
Es widerspricht einfach der Überzeugung, dass das Standardverhalten ein CSV-Export ist, der nicht ordnungsgemäß importiert werden kann. Ich habe festgestellt, dass Excel dasselbe tut. Ich muss nachsehen, ob dies auch eine Option ist.
In der Zwischenzeit dank meines Kollegen, der mich auf diese bizarre Funktionalität hinwies, als ich darüber schimpfte, dass der CSV-Exporter völlig nutzlos war, und dies war der beste Link, den ich darüber gefunden hatte, also dachte ich, ich würde es setzen das Wissen hier zum Nutzen zukünftiger Sucher.
AKTUALISIEREN
Ein Screenshot unten:
quelle
Save Results As..
auf dem gleichen Ergebnismenge vor / nach dem Verhalten ändert nichts an der exportierten CSV macht.Meine normale Problemumgehung besteht darin, sie in die Abfrage einzubauen:
SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...
Sie können dies in eine benutzerdefinierte Funktion einbauen, um dies ein wenig zu vereinfachen. Sie müssen jedoch für jeden Datentyp eine eigene Funktion erstellen.
quelle
'"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'
. Auf diese Weise mache ich mir keine Sorgen, ein Feld zu unterbieten.NVARCHAR
wenn der ursprüngliche Typ warNVARCHAR
.Verschiedene Kombinationen dieser Einstellungen können zu falschen oder partiellen Ergebnissen in der Ausgabe führen. Dies liegt daran, dass Microsoft es nicht für wichtig genug hielt, diese Probleme zu beheben. Ich erkläre nur, was mit CSV-Dateien passiert, wenn die Ergebnisse an eine Datei gesendet werden.
Gehen Sie wie folgt vor, um gute Ergebnisse zu erzielen:
Neues Abfragefenster öffnen (neue Registerkarte / Sitzung) ... Wenn Sie dies nicht tun, geht die unten stehende Konfiguration verloren und wird auf die Standardeinstellungen zurückgesetzt
Schreiben Sie die Abfrage, um das Anführungszeichen im Anführungszeichen zu behandeln, und schließen Sie alle Zeichenfolgendatentypen in Anführungszeichen ein. Beachten Sie auch, dass verschiedene DBMS- und Programmiersprachengrammatiken eine andere Syntax für ein doppeltes Anführungszeichen akzeptieren (wenn Sie diese Ausgabe als Eingabe für ein anderes System verwenden). Einige verwenden
\"
. Einige verwenden""
. XML verwendet"
; Wahrscheinlich ein Grund, warum Microsoft diese Funktionalität ignoriert hat, damit sie sich nicht mit den Argumenten befassen mussten... Wenn Escape Sequence des neuen Systems ist
""
.SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '""') + '"' FROM table1
.. Wenn Escape Sequence des neuen Systems ist
\"
.SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '\"') + '"' FROM table1
Aufbau:
Abfrageoptionen> Ergebnisse> "Spaltenüberschriften beim Kopieren oder Speichern der Ergebnisse einschließen" aktiviert
Abfrageoptionen> Ergebnisse> " Anführungszeichenfolgen mit Listentrennzeichen beim Speichern von CSV-Ergebnissen" - BROKEN; VERWENDE NICHT!
Abfrageoptionen> Ergebnisse> Andere deaktiviert
Abfrageoptionen> Ergebnisse> Text> durch Kommas getrennt (Einstellung in der oberen rechten Ecke)
Abfrageoptionen> Ergebnisse> Text> "Spaltenüberschriften in die Ergebnismenge aufnehmen" aktiviert
Abfrageoptionen> Ergebnisse> Text> Andere deaktiviert
Abfrageoptionen> Ergebnisse> Text> "Maximale Anzahl der in jeder Spalte angezeigten Zeichen" - auf maximale Länge eingestellt, damit Zeichenfolgen nicht abgeschnitten werden.
Abfrage> Ergebnisse in Datei (dies ist ein Wechsel zwischen allen 3 Optionen)
Abfrage ausführen (F5)
Eingabeaufforderung für den Dateinamen des Berichts
Öffnen Sie die Datei, um die Ergebnisse anzuzeigen
quelle
Es ist traurig, dass die Option in einem verwirrenden Zustand verfügbar ist, aber nicht perfekt funktioniert. Das Folgende funktioniert zumindest.
text qualifier
doppeltes Anführungszeichen andu solltest gut gehen!
quelle
quotename
. Zum Glück nicht in doppelte Anführungszeichen geraten. Und ich schlug eine native Option vor, anstatt von externen Lösungen abhängig zu sein.Wie beurteilen Sie den Export von SSMS über PowerShell nach CSV ? In diesem Beitrag wird beschrieben, wie Sie ein externes Tool in SSMS definieren, das die aktuell ausgewählte Abfrage an ein PowerShell-Skript sendet, das in eine CSV exportiert wird.
quelle
Ich kenne keine Möglichkeit, dies allein mit SSMS zu tun. Ich weiß, dass TOAD (http://www.toadworld.com/) eine CSV-Option hat. Ich bin mir nicht sicher, ob es sich um ein Escape-Format handelt. Wenn SSIS eine Option ist, können Sie in ein Format konvertieren, das Zeichenfolgen (echte CSV) entgeht, das sich jedoch nicht in SSMS befindet.
Wenn Sie ein C # -Programm schreiben müssen, würde ich in Betracht ziehen, die Tabelle abzufragen und dann die Abfrage auszuführen, da die Metadaten Aufschluss darüber geben, welche Escapezeichen erforderlich sind.
quelle
Normalerweise benutze ich diese Art von Funktion:
CREATE FUNCTION [dbo].[toExport] ( @txt varchar(max) ) RETURNS varchar(max) AS BEGIN return REPLACE(REPLACE(REPLACE(@txt, ';', ','), CHAR(10), ' '), CHAR(13), ' '); END
Und in select habe ich es hier eingefügt:
SELECT dbo.toExport( column_name ) AS column_name FROM ....
Und in SMSS 2012 klicken Sie einfach mit der rechten Maustaste auf ein Raster und speichern Sie die Ergebnisse unter oder kopieren Sie alle Raster (Strg-A) und Strg-V nach Excel.
Dies ist die einfachste Möglichkeit, Daten beispielsweise in MS Excel ohne Probleme mit Spalten zu verwalten.
Natürlich müssen Sie unter Extras -> Optionen -> Abfrageergebnisse -> SQL Server -> Ergebnisse zum Raster auf "Anführungszeichenfolgen mit Listentrennzeichen beim Speichern von CSV-Ergebnissen" klicken und bei Bedarf die Anzahl der abgerufenen Zeichen erhöhen.
quelle
Möglicherweise funktioniert dies für Ihre Anwendung nicht, aber ich umgehe dieses Problem normalerweise, indem ich es in ein durch Tabulatoren getrenntes Format exportiere. Übersehen Sie diese einfache Lösung nicht, wenn sie für Sie gilt.
quelle
Da alle oben genannten Einstellungen die von meinem SSMS (SQL Server 2014) generierte CSV nicht korrigierten und das Exportieren einer durch Tabulatoren getrennten Datei nicht besser machte, erstellten ein Kollege und ich ein Konverterskript (Ruby) zum Konvertieren des SSMS CSV in lesbare CSV. Es behält die Codierung, Trennzeichen und Zeilenumbrüche der Originaldatei bei und führt am Ende sogar eine Überprüfung der exakten Byte-Übereinstimmung durch (es erstellt eine Datei im SSMS-Format aus der analysierten (!) Eingabedatei und vergleicht beide Dateien).
https://gist.github.com/gr8bit/62202ea89a7e3aff67df2ff080ee8e88
Kontaktieren Sie mich auf Github, wenn Sie auf Fehler stoßen, bitte. Prost!
quelle
Ich denke, es ist am einfachsten, Excel zu öffnen und die Daten aus einer SQL-Verbindung zu importieren, anstatt den SSMS-Export zu verwenden. Ich verwende SSMS 2016 und es gibt keine Option "Anführungszeichenfolgen mit Listentrennzeichen beim Speichern von CSV-Ergebnissen". vermutlich weil es nicht funktioniert
Ron
quelle
Ab 2016 ist dies das Standardverhalten, wenn in den Abfrageoptionen die folgende Option ausgewählt ist:
Spalten werden durch Kommas getrennt, und Felder, die Kommas enthalten, werden in doppelte Anführungszeichen gesetzt.
quelle
Ich möchte einen alternativen Ansatz vorschlagen. Ich habe diese Frage in SO vorgemerkt. In vielen Antworten und Kommentaren abgestimmt. Aber es ist immer ein Chaos, wenn ich die banale Aufgabe erledigen muss, eine CSV-Datei aus einer Abfrage in SQL Management Studio zu exportieren.
Die einfachste Lösung besteht darin, nur ein anderes Tool zu verwenden, den kostenlosen Dbeaver .
Kein Geheimnis. Kein Neustart erforderlich. Es funktioniert einfach.
quelle