Exportieren Sie das Abfrageergebnis in eine CSV-Datei in SQL Server 2008


141

Wie kann ich ein Abfrageergebnis in eine CSV-Datei in SQL Server 2008 exportieren?



Müssen Sie Ihr Trennzeichen entkommen? Die meisten Antworten gehen bisher davon aus, dass Sie dies nicht tun, was eigentlich nicht alles CSV ist.
Nick

@Nick - Trennzeichen sind im Allgemeinen nur in einer Zeichenfolge enthalten und werden normalerweise in Anführungszeichen gesetzt. Siehe meine Antwort, um die Lösung dafür zu sehen. stackoverflow.com/questions/6115054/…
MacGyver


Ich benutze manchmal Python
LV98

Antworten:


168
  1. Öffnen Sie SQL Server Management Studio
  2. Gehen Sie zu Extras> Optionen> Abfrageergebnisse> SQL Server> Ergebnisse in Text
  3. Ganz rechts befindet sich ein Dropdown-Feld namens Ausgabeformat
  4. Wählen Sie Komma getrennt und klicken Sie auf OK

Hier ist eine Vollbildversion dieses Bildes unten

Geben Sie hier die Bildbeschreibung ein

Dadurch werden Ihre Abfrageergebnisse als durch Kommas getrennter Text angezeigt.

So speichern Sie die Ergebnisse einer Abfrage in einer Datei: Strg + Umschalt + F.


10
Die Antwort ist etwas irreführend ... Wenn Sie drücken Ctrl+Shift+F, ändert sich nur der Ausgabemodus. Die Ergebnisse werden nicht beeinflusst, wenn Sie die Abfrage bereits ausgeführt haben. Damit dies wiedergegeben wird, müssen Sie die Abfrage erneut ausführen. Wenn Sie es im Modus "Ergebnisse in Datei" ausführen, sollten Sie gefragt werden, wo Sie die Ergebnisse speichern möchten.
QJake

3
Gehen Sie zu Extras> Optionen> Abfrageergebnisse> SQL Server > Ergebnisse zu Text
Abfrageergebnisse

45
Das erneute Ausführen der Abfrage hat mir nicht gereicht. Ich musste das Abfragefenster schließen, ein neues öffnen und dann die Abfrage erneut ausführen.
Breandán

3
Bestätigter @ Breandán-Kommentar. Die neuen Einstellungen gelten nicht für das aktuell geöffnete Abfragefenster. Sie müssen geschlossen und die Abfrage erneut ausgeführt werden.
Shinigamae

3
Eine Sache, die ich tun musste, war es als Standard-RPT-Erweiterung zu exportieren. Danach können Sie es einfach in eine CSV umbenennen und es funktioniert.
Thomas Bennett

140

Ich weiß, das ist ein bisschen alt, aber hier ist ein viel einfacher Weg ...

  1. Führen Sie Ihre Abfrage mit den Standardeinstellungen aus (legt die Ergebnisse im Rasterformat fest, wenn Ihre nicht im Rasterformat vorliegen, siehe unten)

  2. Klicken Sie mit der rechten Maustaste auf die Rasterergebnisse und klicken Sie auf "Ergebnisse speichern unter" und speichern Sie sie.

Wenn Ihre Ergebnisse nicht im Rasterformat vorliegen, klicken Sie mit der rechten Maustaste auf die Stelle, an der Sie die Abfrage schreiben, bewegen Sie den Mauszeiger über "Ergebnisse an" und klicken Sie auf "Ergebnisse an Raster".

Beachten Sie, dass Sie die Spaltenüberschriften NICHT erfassen!

Viel Glück!


1
Das einzige Problem ist, dass Sie mit dieser Methode anscheinend keine Optionen festlegen können. Zum Beispiel werden alle NULL-Werte in Ausgabedateien als "NULL" usw. angezeigt. Vielleicht gibt es eine Möglichkeit, dies festzulegen, von der ich jedoch nichts weiß.
Noah

13
Erstaunlicherweise zitiert dies selbst in SSMS 2012 den Text für CSV nicht richtig. Ein Komma oder eine neue Zeile in einem CHAR / VARCHAR sollte in Anführungszeichen gesetzt werden, ist es aber nicht. Dadurch werden Daten in neue Spalten oder in eine neue Zeile verschoben.
Eric J.

4
Gibt Ihnen auch keine Spaltenüberschriften.
Don

8
@Don dies gibt Spaltenüberschriften, wenn Sie in "Abfrage" -> "Abfrageoptionen ...", Registerkarte "Raster" gehen und "Spaltenüberschriften beim Kopieren oder Speichern von Ergebnissen einschließen" aktivieren
Rob Wise

7
Dies sollte die Antwort sein.
pspahn

46

Sie können PowerShell verwenden

$AttachmentPath = "CV File location"
$QueryFmt= "Query"

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath

Danke dir! Dies war der einzige Vorschlag, der für mich funktioniert hat. Griffe, die richtig entkommen
emertechie

3
+10 wenn ich könnte. Beantworten Sie nur die Flucht. Damit dies ausgeführt werden konnte, musste ich oben im Skript zwei Zeilen hinzufügen: Add-PSSnapin SqlServerCmdletSnapin100und Add-PSSnapin SqlServerProviderSnapin100.
Eric J.

Wenn Sie vor einer Zeitüberschreitung stehen, fügen Sie die Abfragezeitüberschreitung hinzu , z. B.Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

1
Als Powershell-Neuling musste ich das SqlServer-Modul installieren: Install-Module -Name SqlServer(aber ich musste diese Cmdlets nicht einrasten). Außerdem hatte ich die Befehle in einem Skript gespeichert, das erst ausgeführt wurde, nachdem ich die Ausführungsrichtlinie geändert hatte : Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser.
Sandyscott

@sandyscott Ich bin auch ein Powershell-Neuling, also danke. Jedenfalls denke ich, dass in diesem Fall eine RemoteSignedAusführungsrichtlinie ausreichen wird.
BigBother

14

Wenn die betreffende Datenbank lokal ist, ist das Folgende wahrscheinlich die robusteste Methode, um ein Abfrageergebnis in eine CSV- Datei zu exportieren (dh Ihnen die größte Kontrolle zu geben).

  1. Kopieren Sie die Abfrage.
  2. Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf die betreffende Datenbank.
  3. Wählen Sie "Aufgaben" >> "Daten exportieren ..."
  4. Konfigurieren Sie Ihre Datenquelle und klicken Sie auf "Weiter".
  5. Wählen Sie "Flat File" oder "Microsoft Excel" als Ziel.
  6. Geben Sie einen Dateipfad an.
  7. Wenn Sie mit einer Flatfile arbeiten, konfigurieren Sie diese wie gewünscht. Wenn Sie mit Microsoft Excel arbeiten, wählen Sie "Excel 2007" (frühere Versionen haben ein Zeilenlimit von 64 KB).
  8. Wählen Sie "Schreiben Sie eine Abfrage, um die zu übertragenden Daten anzugeben".
  9. Abfrage aus Schritt 1 einfügen.
  10. Klicken Sie auf Weiter >> Zuordnungen überprüfen >> Klicken Sie auf Weiter >> Wählen Sie "Sofort ausführen" >> Klicken Sie zweimal auf "Fertig stellen".

Nachdem ich diesen Prozess ausführlich durchlaufen hatte, fand ich Folgendes als die beste Option

PowerShell-Skript

$dbname = "**YOUR_DB_NAME_WITHOUT_STARS**"
$AttachmentPath = "c:\\export.csv"
$QueryFmt= @"
**YOUR_QUERY_WITHOUT_STARS**
"@

Invoke-Sqlcmd   -ServerInstance **SERVER_NAME_WITHOUT_STARS** -Database  $dbname -Query $QueryFmt | Export-CSV $AttachmentPath -NoTypeInformation

Führen Sie PowerShell als Administrator aus

& "c:\path_to_your_ps1_file.ps1"

1
Wenn Sie vor einer Zeitüberschreitung stehen, fügen Sie die Abfragezeitüberschreitung hinzu , z. B.Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

6

MS Excel -> Daten -> Neue Abfrage -> Aus Datenbank .. Folgen Sie den Schritten


6

Aufbauend auf der Antwort von NS habe ich ein PowerShell-Skript, das in eine CSV- Datei exportiert, wobei die Anführungszeichen um das Feld und das Komma getrennt sind und die Header-Informationen in der Datei übersprungen werden.

add-pssnapin sqlserverprovidersnapin100
add-pssnapin sqlservercmdletsnapin100

$qry = @"
Select
  *
From
 tablename
"@

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $qry | convertto-CSV -notype | select -skip 1  > "full path and filename.csv"

Die ersten beiden Zeilen ermöglichen die Verwendung des Befehls let von Invoke-SqlCmd .


6

Verwenden Sie T-SQL :

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

Es gibt jedoch einige Einschränkungen:

  1. Sie müssen den Microsoft.ACE.OLEDB.12.0-Anbieter verfügbar haben. Der Jet 4.0-Anbieter wird auch funktionieren, aber er ist uralt, also habe ich stattdessen diesen verwendet.

  2. Die CSV-Datei muss bereits vorhanden sein. Wenn Sie HDR=YESheaders ( ) verwenden, stellen Sie sicher, dass die erste Zeile der CSV-Datei eine durch Trennzeichen getrennte Liste aller Felder ist.


3

Die Verwendung der nativen SQL Server Management Studio-Technik zum Exportieren in CSV (wie von @ 8 KB vorgeschlagen) funktioniert nicht, wenn Ihre Werte Kommas enthalten, da SSMS Werte nicht in doppelte Anführungszeichen setzt. Eine robustere Methode, die für mich funktioniert hat, besteht darin, die Ergebnisse einfach zu kopieren (in das Raster klicken und dann STRG-A, STRG-C) und in Excel einzufügen. Speichern Sie dann als CSV-Datei aus Excel.


2

Sie können QueryToDoc ( http://www.querytodoc.com ) verwenden. Sie können eine Abfrage für eine SQL-Datenbank schreiben und die Ergebnisse - nachdem Sie das Trennzeichen ausgewählt haben - nach Excel, Word, HTML oder CSV exportieren


2
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

as @Slogmeister Extraordinaire Quoted ist korrekt.

Es muss 1> Datei mit Spalten 2 vorhanden sein. 2> Office muss installiert sein

Fehler konfrontiert

1

Meldung 7303, Ebene 16, Status 1, Zeile 1 Das Datenquellenobjekt des OLE DB-Anbieters "Microsoft.ACE.OLEDB.12.0" für den Verbindungsserver "(null)" kann nicht initialisiert werden. "

64 Bit http://download.microsoft.com/download/2/4/3/24375141-E08D-4803-AB0E-10F2E3A07AAA/AccessDatabaseEngine_x64.exe

32 Bit http://download.microsoft.com/download/f/d/8/fd8c20d8-e38a-48b6-8691-542403b91da1/AccessDatabaseEngine.exe

2

Meldung 15281, Ebene 16, Status 1, Zeile 1 SQL Server hat den Zugriff auf STATEMENT 'OpenRowset / OpenDatasource' der Komponente 'Ad Hoc Distributed Queries' blockiert, da diese Komponente im Rahmen der Sicherheitskonfiguration für diesen Server deaktiviert ist. Ein Systemadministrator kann die Verwendung von "Ad-hoc-verteilten Abfragen" mithilfe von sp_configure aktivieren. Weitere Informationen zum Aktivieren von "Ad-hoc-verteilten Abfragen" finden Sie in den SQL Server-Onlinedokumentationen nach "Ad-hoc-verteilte Abfragen".

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO

2

Wenn Sie Powershell nicht verwenden möchten, ist diese Antwort eine Variation der großartigen Antwort von 8 KB. Der einzige Unterschied besteht darin, dass Sie anstelle von CSV als Ausgabeformat Tab Delimited auswählen. Auf diese Weise werden Zellen in Excel nicht übersprungen, wenn Ihre Daten Kommas enthalten. Wenn Sie das Standardtrennzeichen von Excel auf Registerkarten festgelegt haben, können Sie einfach alle SSMS-Abfrageergebnisse (STRG-A, STRG-C) kopieren und in Excel einfügen (Sie müssen nicht als Datei speichern und in Excel importieren) ):

  • Gehen Sie in SSMS zu Extras> Optionen> Abfrageergebnisse> SQL Server> Ergebnisse zu Text
  • Ändern Sie das Ausgabeformat ganz rechts in Tabulatorbegrenzt
  • OK klicken

Jetzt können Sie Ihre Abfrage ausführen, dann STRG-A ausführen, um alle Ergebnisse auszuwählen, dann STRG-C, um sie in die Zwischenablage zu kopieren, dann zu Excel 2013 wechseln (möglicherweise auch 2007, nicht sicher) und einfügen - vorausgesetzt, Excel ist die Standardeinstellung Das Trennzeichen ist auf die Registerkarte gesetzt.

Bild des Bildschirms mit den SSMS-Abfrageoptionen


-1

Ja, all dies ist möglich, wenn Sie direkten Zugriff auf die Server haben. Was aber, wenn Sie nur von einem Web- / Anwendungsserver aus auf den Server zugreifen können? Nun, die Situation war bei uns schon lange her und die Lösung war SQL Server Export to CSV .


Link ... Zugriff verweigert?
Hoggar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.