Wir müssen die SELECT-Abfrageergebnisse in eine CSV-Datei schreiben. Wie geht das mit T-SQL in SQL Server 2008 r2? Ich weiß, dass dies in SSIS möglich ist, aber aus bestimmten Gründen haben wir diese Option nicht.
Ich habe versucht, den im folgenden Artikel vorgeschlagenen Prozess zu verwenden, aber wenn ich den Prozess ausführe, SQL beschwert sich, dass sys.sp_OACreate und sys.sp_OADestroy, die in diesem Prozess aufgerufen werden, nicht ausgeführt werden können.
Wissen Sie, wie wir diese Komponenten aktivieren können oder wie Sie mit T-SQL besser in eine Datei schreiben können?
Vielen Dank im Voraus.
Antwort
Verwenden Sie BCP-Dienstprogramm
bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T
Das Argument -c
gibt c Zeichenausgabe im Gegensatz zum nativen Binärformat von SQL; standardmäßig werden durch Tabulatoren getrennte Werte verwendet, aber -t ,
Ändert das Feld t erminator in Kommas. -T
gibt die Windows-Authentifizierung an („ t verrostete Verbindung „), andernfalls verwenden Sie -U MyUserName -P MyPassword
.
Dies exportiert standardmäßig keine Spaltenüberschriften. Sie müssen eine UNION ALL für Header verwenden.
ODER
Verwenden Sie SQLCMD
SQLCMD -S SERVERNAME -E -Q "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" -s "," -o "D:\MyData.csv"
ODER
Powershell verwenden
Hier ist ein Link zu einem Artikel . Wenn Sie dies am Ende verwenden, möchten Sie möglicherweise -notype
nach Export-Csv $extractFile
anhängen, um die unnötige Spalte in der Ausgabedatei zu entfernen.
Kommentare
- +1 Für das BCP-Dienstprogramm – es ist sehr einfach zu bedienen und das schnellste Tool, das ich jemals für den Export / Import verwendet habe Informationen und es gibt viele Möglichkeiten. Ich rate Ihnen, “ > FileName.log “ am Ende des Anweisung – Dadurch wird eine Protokolldatei erstellt.
- Jede Antwort, die ein GUI-Programm betrifft, ist einfach nicht möglich. Dies ist aus DBA-Sicht die beste Lösung!
Antwort
Hinzufügen zur vorherigen Antwort, die hilft Ihnen bei der Automatisierung der Aktion. Wenn Sie sie nur von Zeit zu Zeit benötigen, können Sie sie in Management Studio ausführen. Klicken Sie einfach mit der rechten Maustaste auf die Kopfzeile – Ergebnisse speichern unter -> wählen Sie a. CSV-Datei .
Wenn Sie dies für jede von Ihnen ausgeführte select-Anweisung tun möchten, können Sie die Ausgaberichtung der Ergebnisse in eine Datei ändern. Verwenden Sie Tools -> Optionen -> Abfrageergebnisse – Ergebnisse, um abzulegen.
Eine andere Möglichkeit, die dies kann Mit der Funktion „Daten exportieren“ von Management Studio können Sie einfach automatisieren und SSIS verwenden. Klicken Sie mit der rechten Maustaste auf die Datenbank -> Aufgaben -> Daten exportieren. Dort gibt es einen Assistenten mit vielen Optionen. Sie sollten die Quellendatenbank, das Ziel und andere Optionen auswählen. Stellen Sie für das Ziel sicher, dass es sich um eine „flache Datei“ handelt, durchsuchen Sie und wählen Sie den CSV-Typ Wählen Sie die gewünschte Formatierung und am Ende erhalten Sie ein SSIS-Paket, das lokal gespeichert und bei Bedarf wiederholt werden kann.
Antwort
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:
- Sie müssen haben der Microsoft.ACE.OLEDB.12.0-Anbieter verfügbar. Der Jet 4.0-Anbieter wird auch funktionieren, aber er ist uralt, daher habe ich stattdessen diesen verwendet.
- Die CSV-Datei muss bereits vorhanden sein. Wenn Sie Header verwenden (HDR = YES) Stellen Sie sicher, dass die erste Zeile der CSV-Datei eine durch Trennzeichen getrennte Liste aller Felder ist.
Kommentare
- Beste Antwort weit!
- großartige Arbeit einschließlich Einschränkungen
- Eine weitere Einschränkung: Möglicherweise benötigen Sie Berechtigungen, andernfalls werden Sie sehen: Nachricht 15281, Ebene 16, Status 1, Zeile 2 SQL Server blockiert den Zugriff auf STATEMENT ‚ OpenRowset / OpenDatasource ‚ der Komponente ‚ Ad-hoc-verteilte Abfragen ‚, da diese Komponente im Rahmen der Sicherheitskonfiguration für diesen Server deaktiviert ist. Ein Systemadministrator kann die Verwendung von ‚ verteilten Ad-hoc-Abfragen ‚ mithilfe von sp_configure aktivieren. Weitere Informationen zum Aktivieren von ‚ verteilten Ad-hoc-Abfragen ‚ finden Sie unter ‚ Ad-hoc Verteilte Abfragen ‚ in SQL Server-Onlinedokumentation.
Antwort
Low Tech, aber …
select col1 + "," + cast(col2 as varchar(10)) + "," + col3 from mytable;
Kommentare
- MySQL behandelt
col1 + ',' + cast(col2 as varchar(10)) + ',' + col3
als Spaltenname und gibt überall NULL aus.
Antwort
Es sieht so aus, als hätten Sie bereits eine akzeptable Lösung, aber wenn Sie DB Mail eingerichtet haben, haben Sie diese eingerichtet Dies könnte möglicherweise Folgendes bewirken:
EXEC msdb.dbo.sp_send_dbmail @recipients="[email protected]", @subject="CSV Extract", @body="See attachment", @query ="SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable", @attach_query_result_as_file = 1, @query_attachment_filename = "CSV_Extract.txt", @query_result_separator = ",", @query_result_header = 1
Wenn Sie die Datei ohnehin irgendwo per E-Mail versenden, sparen Sie möglicherweise einige Schritte.
Kommentare
- Genau das, wonach ich gesucht habe, ein großes Lob an Sie!
- Obwohl Sie den Parameter @profile_name hinzufügen müssen, wenn Sie kein privates Standardprofil haben für Ihren Benutzer oder ein öffentliches Profil für die Datenbank.
Antwort
Dies kann einfach in drei Schritten erfolgen Prozess:
-
Schreiben Sie Ihre Abfrage als
SELECT INTO
Abfrage. Dadurch werden Ihre Abfrageergebnisse im Wesentlichen in eine Tabelle exportiert.Select Field1 ,Field2 ,Field3 INTO dbo.LogTableName --Table where the query Results get logged into. From Table
Hinweis: Diese Tabelle kann nicht ist vorhanden, wenn die Abfrage ausgeführt wird, da dieser Abfragetyp die Tabelle als Teil der Ausführung erstellen möchte.
-
Verwenden Sie dann SSIS zum Exportieren Die Ergebnisse dieser Tabelle lauten
.csv
. Mit dem SSIS-Exportassistenten können Sie Ihr Trennzeichen usw. auswählen. Dies ist sehr praktisch für die Verwendung eines | Trennzeichen in Fällen, in denen die Ergebnismenge Kommas enthält.Klicken Sie mit der rechten Maustaste auf
DB Name > Tasks > Export Data
-
Führen Sie nach Abschluss des Exports die Befehl zum Bereinigen Ihrer Protokolltabelle.
Drop Table dbo.LogTableName
Kommentare
- Hallo Don. Ich habe Ihrer Antwort eine Formatierung hinzugefügt. Sie können auf ‚ ‚ unten links bearbeiten, um zu sehen, was ‚ ist geändert und klicken Sie auf das Bit “ bearbeitet “ xx Minuten „, um einen vollständigen Verlauf anzuzeigen wenn Sie zurückrollen möchten. Obwohl dies praktikabel ist, fügt Ihre Antwort ‚ nicht viel über das hinzu, was ‚ bereits geschrieben wurde, und wird wahrscheinlich nicht viel Aufmerksamkeit erregen.
Antwort
Diese Prozedur generiert eine CSV-Datei mit der Ausgabe der Abfrage, die Sie als Parameter übergeben. Der zweite Parameter ist Ihr CSV-Dateiname. Stellen Sie sicher, dass Sie den Dateinamen mit einem gültigen beschreibbaren Pfad übergeben.
Hier ist das Skript zum Erstellen der Prozedur:
CREATE procedure [dbo].[usp_create_csv_file_from_query] @sql Nvarchar(MAX), @csvfile Nvarchar(200) as BEGIN if IsNull(@sql,"") = "" or IsNull(@csvfile,"") = "" begin RAISERROR ("Invalid SQL/CsvFile values passed!; Aborting...", 0, 1) WITH NOWAIT return end DROP TABLE if exists global_temp_CSVtable; declare @columnList varchar(4000), @columnList1 varchar(4000), @sqlcmd varchar(4000), @dos_cmd nvarchar(4000) set @sqlcmd = replace(@sql, "from", "into global_temp_CSVtable from") EXECUTE (@sqlcmd); declare @cols table (i int identity, colname varchar(100)) insert into @cols select column_name from information_schema.COLUMNS where TABLE_NAME = "global_temp_CSVtable" declare @i int, @maxi int select @i = 1, @maxi = MAX(i) from @cols while(@i <= @maxi) begin select @sql = "alter table global_temp_CSVtable alter column [" + colname + "] VARCHAR(max) NULL" from @cols where i = @i exec sp_executesql @sql select @i = @i + 1 end SELECT @columnList = COALESCE(@columnList + """, """, "") + column_name ,@columnList1 = COALESCE(@columnList1 + ", ", "") + column_name from information_schema.columns where table_name = "global_temp_CSVtable" ORDER BY ORDINAL_POSITION; SELECT @columnList = """" + @columnList + """"; SELECT @dos_cmd="BCP "SELECT " + @columnList + " UNION ALL " + "SELECT * from " + db_name() + "..global_temp_CSVtable" " + "QUERYOUT " + @csvfile + " -c -t, -T" exec master.dbo.xp_cmdshell @dos_cmd, No_output DROP TABLE if exists global_temp_CSVtable; end
Kommentare
- Nur Code-Antworten werden ‚ hier nicht als akzeptabel angesehen. Können Sie Ihre Antwort kommentieren und warum sie funktioniert? (Codekommentare würden wahrscheinlich auch hier helfen)
- Ja, und können Sie auch ein Beispiel hinzufügen, wie Sie es erfolgreich verwenden?
Antwort
Ich verwende MS Access DoCMD zum Exportieren von CSVs aus SQL Server. Dies ist mit einem einzigen Befehl möglich. Die Zugriffsdatenbank wird nur zum Aktivieren des Zugriffsbefehls verwendet. Es funktioniert gut und erstellt als zusätzlichen Vorteil (nicht sicher warum) eine schema.ini für die exportierte Tabelle.
Adam
CMD="SELECT * INTO [Text;HDR=Yes;DATABASE=C:\].[Results.txt] FROM [ODBC;DSN=SQL2017;Description=SQL2017;UID=.;Trusted_Connection=Yes;APP=Microsoft Office 2013;WSID=LAPTOP-XYZ;DATABASE=TempDB_DataDump_1].Results " Set appAccess = CreateObject("Access.Application") appAccess.OpenCurrentDatabase "anyAccessdatabase.mdb" " appAccess.DoCmd.SetWarnings 0 appAccess.DoCmd.runsql "CMD"