Export Stored Procedure to CSV

Horst

Benutzer
Beiträge
11
Hallo!

Ich habe ein Stored Procedure mit 3 Paramtern, die an die SP übergebe. Die Ergebnismenge der SP möchte ich per SQL-Script in eine CSV-Datei exportieren.

Doch wie?
 
Werbung:
Hallo!

Ich habe ein Stored Procedure mit 3 Paramtern, die an die SP übergebe. Die Ergebnismenge der SP möchte ich per SQL-Script in eine CSV-Datei exportieren.

Doch wie?

Also in PG ginge das exakt auch so als wäre es eine Tabelle.

Code:
COPY { table_name [ ( column_name [, ...] ) ] | ( query ) }
  TO { 'filename' | PROGRAM 'command' | STDOUT }
  [ [ WITH ] ( option [, ...] ) ]

Also in etwa copy (select * from deine_tolle_sp(para1, para2, para3)) to 'filename' CSV. Ich denke mal, auch in M$SQL wird das analog dem Vorgehen zu einer 'normalen' Tabelle sein.
 
-- MyProcedure erwartet drei Parameter
-- Ich habe nun gemacht:
DECLARE @sqlstring varchar(1000)
set @sqlstring = 'bcp ' + '"dbo.MyProcedure' + '''MAS02'''+','+''''''+ '''de-DE''' + 'queryout "c:\textfile.csv" -c -t -Sserver2k8'
EXEC master..xp_cmdshell @sqlstring

Und bekomme folgenden Output angezeigt:
Syntax: bcp {dbtable | query} {in | out | queryout | format} Datendatei
[-m Maxfehler] [-f Formatdatei] [-e Fehlerdatei]
[-F erste Zeile] [-L letzte Zeile] [-b Batchgröße]
[-n systemeigener Typ] [-c Zeichentyp] [-w Doppelbyte-Zeichentyp]
[-N Nichttext systemeigen belassen] [-V Dateiformatversion] [-q Bezeichner in Anführungszeichen]
[-C Codepageangabe] [-t Feldabschlusszeichen] [-r Zeilenabschlusszeichen]
[-i Eingabedatei] [-o Ausgabedatei] [-a Paketgröße]
[-S Servername] [-U Benutzername] [-P Kennwort]
[-T vertrauenswürdige Verbindung] [-v Version] [-R regional aktivieren]
[-k Nullwerte beibehalten] [-E Identitätswerte beibehalten]
[-h "Ladehinweise"] [-x XML-Formatdatei generieren]
[-d- Datenbankname]
NULL

Wo ist was verkehrt
 
-- MyProcedure erwartet drei Parameter
-- Ich habe nun gemacht:
DECLARE @sqlstring varchar(1000)
set @sqlstring = 'bcp ' + '"dbo.MyProcedure' + '''MAS02'''+','+''''''+ '''de-DE''' + 'queryout
Wo ist was verkehrt


Ich nix M$SQL, aber der erwartet laut "Syntax: bcp {dbtable | query} " eine Table oder Query. Also sollte das was wie "select * from dbo.MyProcedure" stehen, denke ich mal.
 
Aber ich möcht das ja mit einer Procedure machen

weil das:
SET @cmd = 'bcp +'"EXEC MyProcedure + '''MAS02'''+','+''''''+ '''de-DE''' + 'queryout "c:\textfile.csv" -c -t -Sserver2k8'

Funktiert ebenso wenig.


Deswegen ja auch meine Frage funktioniert das mit bcp und Stored Procedure überhaupt?
 
Versuche es auf der Kommandozeile nachzubauen - ich glaube du hast dich hier mit den ganzen Anführungszeichen etc. ein wenig vertan.

Ein wenig mehr Beispiele zu bcp findest du noch hier:

https://www.simple-talk.com/sql/dat...ng-csv-files-using-bcp-and-stored-procedures/

So sieht es z.b. auf der cmd aus (noch ohne parameter):

bcp "exec dbo.test" queryout "c:\temp\test.csv" -T -S SERVER -d "DATENBANK" -c -t;

Edit: so sieht es mit Parametern aus:

bcp "exec dbo.test @ITEM = '2'" queryout "c:\temp\test.csv" -T -S SERVER -d "DATENBANK" -c -t;

Starting copy...
1000 rows successfully bulk-copied to host-file. Total received: 1000
1000 rows successfully bulk-copied to host-file. Total received: 2000

2454 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 63 Average : (38952.38 rows per sec.)


Zur Stolperfalle kann auch noch der Benutzer werden - ich habe hier -T gesetzt für Trusted connection in der cmd, ich denke aber das die xp_cmdshell mit dem Benutzers des SQL Agent ausgeführt wird.
 
Zuletzt bearbeitet:
Irgendwas mache ich grundlegend verkehrt
Meine Stored Procedure erwartet drei Parameter
@Culture
@SortTypeNumber
@SortTypeVariant

bcp "exec dbo.STPREP_ReportSortTypeSingle @Culture = 'de-De' @SortTypeNumber='4711' @SortTypeVariant=0" queryout "c:\temp\test.csv" -T -S server2k8 -d "MPC" -c -t;

Nun sagt mir der SQL-Server

Meldung 102, Ebene 15, Status 1, Zeile 1
Falsche Syntax in der Nähe von 'queryout'.

Wenn ich das ganze mit
DECLARE @sqlstring varchar(1000)
set @sqlstring = 'bcp ' + ' "exec dbo.STPREP_ReportSortTypeSingle @Culture = 'de-De' @SortTypeNumber='4711' @SortTypeVariant=0" queryout "c:\temp\test.csv" -T -S server2k8 -d "MPC" -c -t;'
EXEC master..xp_cmdshell @sqlstring

bekomme ich wieder die Meldung:
Syntax: bcp {dbtable | query} {in | out | queryout | format} Datendatei
[-m Maxfehler] [-f Formatdatei] [-e Fehlerdatei]
[-F erste Zeile] [-L letzte Zeile] [-b Batchgröße]
[-n systemeigener Typ] [-c Zeichentyp] [-w Doppelbyte-Zeichentyp]
[-N Nichttext systemeigen belassen] [-V Dateiformatversion] [-q Bezeichner in Anführungszeichen]
[-C Codepageangabe] [-t Feldabschlusszeichen] [-r Zeilenabschlusszeichen]
[-i Eingabedatei] [-o Ausgabedatei] [-a Paketgröße]
[-S Servername] [-U Benutzername] [-P Kennwort]
[-T vertrauenswürdige Verbindung] [-v Version] [-R regional aktivieren]
[-k Nullwerte beibehalten] [-E Identitätswerte beibehalten]
[-h "Ladehinweise"] [-x XML-Formatdatei generieren]
[-d- Datenbankname]
NULL

was mache ich denn verkehrt?????
 
Werbung:
Ich würde nach wie vor zuerst auf der cmd bleiben bis du hier einen Output erziehlst. Kannst du in der Stored Procedure Standardwerte für die Parameter vergeben?
Bitte prüfe ob du nicht die -U Option statt -T benötigst (für die Eingabe von Username & Passwort).

So sieht es hier aus:

DECLARE @sqlstring varchar(1000)
set @sqlstring = 'bcp "exec dbo.GetRecords @OrdNR = ''ORD-03415%'', @OutQTY = 2500000, @ExpRepDate = ''2014-06-01''" queryout "c:\temp\test.csv" -T -S SERVER -d "DATENBANK" -c -t;'
EXEC master..xp_cmdshell @sqlstring

Folgender Output im Result Fenster:

output
NULL
Starting copy...
NULL
2 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 141 Average : (14.18 rows per sec.)
NULL
 
Zuletzt bearbeitet:
Zurück
Oben