Wie erhalte ich eine Exportausgabe im "echten" CSV-Format in SQL Server Management Studio?

79

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.

Peter Recore
quelle
1
Weil es mich so nervte, schrieb ich ein eigenes Programm, das einen richtigen CSV-Writer verwendet: github.com/deeja/SQLtoCSV/releases
Dan
3
Wie
Rei Miyasaka

Antworten:

124

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:

  1. Wie kommt es, dass es nicht standardmäßig aktiviert ist?
  2. Wie kommt es, dass dies eine Option und kein wesentlicher Bestandteil des CSV-Exportcodes ist?

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:Geben Sie hier die Bildbeschreibung ein

Matthew Walton
quelle
4
Existiert auch in SSMS 2008.
Lloyd
21
Hinweis : SSMS qualifiziert ein Feld mit einem Trennzeichen oder Qualifizierer, ein Feld mit Zeilenumbrüchen jedoch nicht. In dieser Hinsicht erzeugt SSMS technisch ungültige CSV-Dateien
KyleMit
41
Für alle anderen, die das gleiche Problem hatten wie ich: Sie müssen ein neues Abfrageeditorfenster öffnen, damit die Änderungen wirksam werden. Doing Save Results As..auf dem gleichen Ergebnismenge vor / nach dem Verhalten ändert nichts an der exportierten CSV macht.
Jason Larke
7
In SSMS v17 stellte ich fest, dass die angegebene Option fehlte. Sie scheint jedoch mit der anderen Option "Spaltenüberschriften beim Kopieren oder Speichern der Ergebnisse einbeziehen" zusammengeführt worden zu sein, da die Überprüfung den gewünschten Effekt für mich hatte. Das Öffnen eines neuen Abfragefensters ist weiterhin erforderlich, damit die Einstellung wirksam wird.
Neun Schwänze
9
Microsoft: "Machen wir CSVs zum Standardexportformat für SSMS". Auch Microsoft: "Lassen Sie uns grundlegende Implementierungsdetails ignorieren."
Owen
12

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.

Joel Coehoorn
quelle
2
Könnte nicht notwendig sein, aber ich finde es einfacher, nur '"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'. Auf diese Weise mache ich mir keine Sorgen, ein Feld zu unterbieten.
Rob
1
Heute benutze ich varchar (max). Als ich das ursprünglich schrieb, war ich gerade aus einem Geschäft gekommen, das noch nur auf (ugh) SQL Server 2000 lief und erst 2005 anfing zu schauen.
Joel Coehoorn
Möglicherweise müssen Sie auch den Spaltentyp beibehalten, z. B. NVARCHARwenn der ursprüngliche Typ war NVARCHAR.
NM
Guter Punkt. varchar => nvarchar erweitert sich, wird die Dinge nicht kaputt machen, aber nvarchar => varchar kann Daten verlieren. Am besten verwenden Sie alles, was mit der ursprünglichen Spalte übereinstimmt. Da die Benutzer jedoch dazu neigen, nur Beispielcode aus dem Stapelüberlauf zu kopieren / einzufügen, ist der Code in meiner Antwort wahrscheinlich besser für die Verwendung von nvarchar (und diese Änderung wird jetzt vorgenommen).
Joel Coehoorn
Da Microsoft nicht so einfach wie den Export in eine CSV-Datei ausführen kann, ist dies die beste Lösung. Meine Dateien mit Zeilenumbrüchen wurden mit der am häufigsten gewählten Lösung nicht korrekt exportiert.
Neves
8

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

HINWEIS: Wenn Sie dies regelmäßig tun müssen, sollten Sie nur ein Programm entwickeln, das dies für Sie in .NET oder Java oder in einer anderen Sprache erledigt, mit der Sie vertraut sind. Andernfalls besteht eine hohe Wahrscheinlichkeit, dass Sie einen Fehler machen. Beachten Sie dann die Syntax des Systems, in das Sie importieren, bevor Sie den Export aus SQL Server definieren.

MacGyver
quelle
6

Es ist traurig, dass die Option in einem verwirrenden Zustand verfügbar ist, aber nicht perfekt funktioniert. Das Folgende funktioniert zumindest.

  1. Wählen Sie "Aufgaben> Daten exportieren" aus dem DB-Kontextmenü (funktioniert auch nicht auf Tabellenebene).
  2. Wählen Sie als Quelle "Microsoft OLE DB-Anbieter für SQL Server".
  3. Wählen Sie als Ziel "Flat File ..." und geben Sie "Format" als abgegrenztes und text qualifierdoppeltes Anführungszeichen an
  4. Wählen Sie Tabelle oder Abfrage (ich habe mit Abfrage gearbeitet)
  5. Beenden Sie den Assistenten

du solltest gut gehen!

user1017815
quelle
5
Sie würden denken, dass dies funktionieren würde, aber keine Spalten mit doppelten Anführungszeichen in den Daten werden nicht ordnungsgemäß maskiert. Faux-csv ist alles, was SQL Server im Export-Assistenten erledigt.
Mattmc3
Ich oder mein Verbraucher hatten keinen Grund, sich zu beschweren, wenn die Daten Kommas und einfache Anführungszeichen in den Textfeldern enthielten. Wie bereits erwähnt, habe ich mit der Abfrageoption gearbeitet. Wenn Sie sich schmutziger Felder bewusst sind, können Sie diese jederzeit umbrechen 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.
user1017815
Diese Option ist immer noch die praktischste, auch wenn sie nicht automatisch doppelten Anführungszeichen entgeht. Es ist einfach genug, doppelte Zahlen in Anführungszeichen mit replace () zu umgehen.
Brett Donald
4

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.

billinkc
quelle
Bisher sieht das nach dem besten Knall für mein Geld aus. Ich habe es noch nicht einmal zum Menü Externe Tools in SSMS hinzugefügt - ich führe es nur über die Befehlszeile aus.
Peter Recore
1

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.

Gregory A Beamer
quelle
1

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.

Maciej Niemir
quelle
1

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.

Brian Wirt
quelle
1

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!

Niklas B.
quelle
Ich muss das testen, aber das scheint genau das zu sein, was wir brauchen, und es ist bereits in Ruby. Toll!
Ladislav Gallay
0

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

Ron
quelle
0

Ab 2016 ist dies das Standardverhalten, wenn in den Abfrageoptionen die folgende Option ausgewählt ist:

Geben Sie hier die Bildbeschreibung ein

Spalten werden durch Kommas getrennt, und Felder, die Kommas enthalten, werden in doppelte Anführungszeichen gesetzt.

brazofuerte
quelle
0

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 .

  1. Laden Sie das Multiplattform-Datenbanktool Dbeaver herunter (es gibt eine tragbare Version, die Sie verwenden können, wenn Sie keine Administratorrechte auf Ihrem Computer haben).
  2. Führen Sie es aus und erstellen Sie eine neue SQL Server-Verbindung.
  3. Öffnen Sie eine neue Registerkarte "SQL-Editor"
  4. Klicken Sie auf den Pfeil, um Ihre Abfrage auszuführen
  5. Klicken Sie mit der rechten Maustaste auf das Ergebnisraster und wählen Sie "Daten exportieren" und dann CSV
  6. Voilá! Jetzt haben Sie eine anständig formatierte CSV-Datei.

Kein Geheimnis. Kein Neustart erforderlich. Es funktioniert einfach.

neves
quelle