it-swarm.com.de

Wie erhalten Sie eine Exportausgabe im "echten" CSV-Format in SQL Server Management Studio?

Ich habe eine Abfrage, die in SQL Server Management Studio ausgeführt wird (Verbindung zu einer SQL Server 2005-Datenbank). Ich möchte die Daten im CSV-Format exportieren. Nicht das CSV-Format, in dem Sie nur ein Komma zwischen die einzelnen Spalten setzen, sondern das "echte" CSV-Format, in dem Sie die 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 wannabe-Format. Ich kann nicht herausfinden, wo die Möglichkeit steht, Strings zu zitieren.

Wenn SSMS für dieses grundlegende Leistungsmerkmal wirklich unfähig ist, gibt es andere Tools, die dies problemlos tun können? Ich möchte nicht jedes Mal, wenn ich einen Daten-Dump benötige, ein C # -Programm schreiben müssen.

58
Peter Recore

In SSMS 2012 gibt es dafür eine Option. Unter Extras -> Optionen -> Abfrageergebnisse -> SQL Server -> Ergebnisse für Grid wird diese Option als "Zitatzeichenfolgen mit Listentrennzeichen beim Speichern von CSV-Ergebnissen" bezeichnet. Ich weiß nicht, wie lange eine solche Option existiert, aber ich bin durch zwei Dinge verblüfft:

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

Es widerspricht nur der Annahme, dass das Standardverhalten darin besteht, CSV-Export zu haben, der nicht richtig importiert werden kann. Ich habe bemerkt, dass Excel dasselbe tut, ich muss sehen, ob das auch eine Option hat.

In der Zwischenzeit danke ich meinem Kollegen, der mich auf diese bizarre Funktionalität aufmerksam machte, als ich darüber sprach, dass der CSV-Exporteur völlig nutzlos war. Dies war die beste Verbindung, die ich darüber gefunden hatte das Wissen hier zum Nutzen zukünftiger Sucher.

AKTUALISIEREN

Ein Screenshot unten:  enter image description here

106
Matthew Walton

Meine normale Lösung besteht darin, es in die Abfrage einzubauen:

SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...

Sie können dies in eine benutzerdefinierte Funktion einbauen, um es etwas zu vereinfachen, aber Sie müssen für jeden Datentyp eine eigene Funktion erstellen.

10
Joel Coehoorn

Unterschiedliche Kombinationen dieser Einstellungen können zu falschen oder unvollständigen Daten führen. Dies liegt daran, dass Microsoft es nicht für wichtig genug hielt, um diese Probleme zu beheben. Ich erkläre nur, was mit CSV-Dateien passiert, wenn die Ergebnisse an eine Datei gesendet werden. 

Um gute Ergebnisse zu erzielen, mache Folgendes:

Neues Abfragefenster öffnen (neue Registerkarte/Sitzung) ... Wenn Sie dies nicht tun, geht die folgende Konfiguration verloren und wird auf die Standardeinstellungen zurückgesetzt

Schreiben Sie die Abfrage, um das Angebot innerhalb des Angebots zu behandeln, und binden Sie auch alle Zeichenfolgendatentypen in Anführungszeichen ein. Beachten Sie auch, dass unterschiedliche Grammatikdateien für DBMS und Programmiersprachen eine andere Syntax für ein Escape-Anführungszeichen akzeptieren (wenn diese Ausgabe als Eingabe für ein anderes System verwendet wird). Einige verwenden \". Einige verwenden "". XML verwendet &quot ;. Wahrscheinlich ein Grund, warum Microsoft diese Funktionalität ignorierte, sodass sie sich nicht mit den Argumenten auseinandersetzen mussten.

.. Wenn die Escape-Sequenz des neuen Systems "" ist.

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '""') + '"' FROM table1

.. Wenn die Escape-Sequenz des neuen Systems \" ist.

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '\"') + '"' FROM table1

Aufbau:

Abfrageoptionen> Ergebnisse> "Spaltenüberschriften beim Kopieren oder Speichern der Ergebnisse einbeziehen" aktiviert

Abfrageoptionen> Ergebnisse> "Anführungszeichenfolgen mit Listentrennzeichen beim Speichern von .csv-Ergebnissen" - BROKEN; VERWENDE NICHT!

Abfrageoptionen> Ergebnisse> Andere nicht markiert

Abfrageoptionen> Ergebnisse> Text> durch Kommas getrennt (Einstellung in der rechten oberen Ecke)

Abfrageoptionen> Ergebnisse> Text> "Spaltenüberschriften in die Ergebnismenge aufnehmen" aktiviert

Abfrageoptionen> Ergebnisse> Text> andere nicht markiert

Abfrageoptionen> Ergebnisse> Text> "Maximale Anzahl von Zeichen, die in jeder Spalte angezeigt werden" - Auf maximale Länge festlegen, damit Zeichenfolgen nicht abgeschnitten werden.

Abfrage> Ergebnisse in Datei (dies ist ein Wechsel zwischen allen 3 Optionen)

Abfrage ausführen (F5)

Aufforderung zur Eingabe des Dateinamens des Berichts

Datei öffnen, um die Ergebnisse anzuzeigen

HINWEIS: Wenn Sie dies regelmäßig tun müssen, ist es besser für Sie Sie müssen lediglich ein Programm entwickeln, das dies in .NET oder Java für Sie erledigt. oder in welcher Sprache Sie sich wohl fühlen. Ansonsten haben Sie eine hohe Wahrscheinlichkeit, einen Fehler zu machen. Seien Sie sich des Syntax des Systems, in das Sie importieren, bevor Sie Ihr .__ definieren. aus SQL Server exportieren.

7
MacGyver

Was denkst du über 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-Datei exportiert wird.

4
billinkc

Es ist traurig, dass die Option in einem verwirrenden Zustand verfügbar ist, jedoch nicht perfekt einsatzbereit ist. Folgendes 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-Provider für SQL Server" aus.
  3. Als Ziel wählen Sie "Flat File ..." und geben Sie "Format" als Trennzeichen und text qualifier als Anführungszeichen an
  4. Tabelle oder Abfrage auswählen (ich habe mit Abfrage gearbeitet)
  5. Beenden Sie den Assistenten

du solltest gut sein! 

3
Sumesh R

Ich kenne keine Möglichkeit, dies mit SSMS alleine zu tun. Ich weiß, dass TOAD (http://www.toadworld.com/) eine CSV-Option hat. Nicht sicher, ob es ein Escape-Format ist. Wenn SSIS eine Option ist, können Sie in ein Format konvertieren, das Zeichenfolgen entweicht (True CSV), jedoch nicht in SSMS.

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 darauf hinweisen, welche die Escape-Anweisung benötigen.

1

Da alle oben genannten Einstellungen den CSV, den mein SSMS (SQL Server 2014) generierte und der Export einer durch Tabulatoren getrennten Datei nicht verbessert hat, nicht verbessert haben, haben ein Kollege und ich ein Konvertierungsskript (Ruby) erstellt, um das SSMS zu konvertieren CSV in lesbare CSV-Datei . Sie speichert Kodierungen, Trennzeichen und Zeilenumbrüche der Originaldatei und führt am Ende sogar eine Exakt-Byte-Übereinstimmungsprüfung durch (sie erstellt eine Datei im SSMS-Format aus der analysierten (!) Eingabedatei und vergleicht beide Dateien).

https://Gist.github.com/gr8bit/62202ea89a7e3aff67df2ff080ee8e88

Kontaktieren Sie mich bitte bei github, wenn Sie Fehler feststellen. Prost!

1
Niklas B.

Möglicherweise funktioniert das für Ihre Anwendung nicht, aber normalerweise umgehe ich dieses Problem, indem Sie in ein durch Tabulatoren getrenntes Format exportieren. Übersehen Sie diese einfache Lösung nicht, wenn sie für Sie zutrifft.

1
Brian Wirt

Normalerweise verwende 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 stelle ich es hier:

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 die Ergebnisse als oder kopieren Sie alle Raster (Strg-A) und Strg-V nach Excel.

Es ist die einfachste Möglichkeit, Daten in MS Excel ohne Probleme mit Spalten zu verwalten.

Natürlich müssen Sie in Tools -> Optionen -> Abfrageergebnisse -> SQL Server -> Results to Grid auf "Zitatstrings mit Listentrennzeichen beim Speichern von .csv-Ergebnissen" klicken und bei Bedarf die Maximale Anzahl der gefundenen Zeichen erhöhen.

1
Maciej Niemir

Ich denke, am einfachsten ist es, Excel zu öffnen und die Daten von einer SQL-Verbindung zu importieren, anstatt den SSMS-Export zu verwenden ..... Ich benutze SSMS 2016 und hat nicht die Option "Zitatstrings enthalten, die beim Speichern Listentrennzeichen enthalten. csv results "vermutlich, weil es nicht funktioniert

Ron

0
ron