BCP Storeprocedure Export

Frase

Neuer Benutzer
Beiträge
3
Hallo,

ich probiere gerade ein wenig rum mit BCP und Storeprededure in MS SQL Server 2012.

Dies ist der Script der unter der Windows Eingabeaufforderung klappt. Dies möchte ich komplett so in SQL in einer Storeprocedure abspeichern.
Code:
set BCP_EXPORT_DB=TestDB
set BCP_EXPORT_TABLE=Table

BCP "DECLARE @colnames VARCHAR(max);SELECT @colnames = COALESCE(@colnames + ';',
'') + column_name from %BCP_EXPORT_DB%.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='%BCP_EXPORT_TABLE%'; select @colnames;" queryout C:/PDF_Out/HeadersOnly.csv -c -T

BCP %BCP_EXPORT_DB%.dbo.%BCP_EXPORT_TABLE% out C:/PDF_Out/TableDataWithoutHeaders.csv -c -t; -T

set BCP_EXPORT_DB=
set BCP_EXPORT_TABLE=

copy /b /Y C:/PDF_Out/HeadersOnly.csv+C:/PDF_Out/TableDataWithoutHeaders.csv "C:/PDF_Out/Table.csv"

del C:/PDF_Out/HeadersOnly.csv
del C:/PDF_Out/TableDataWithoutHeaders.csv

Einen Teil davon habe ich auch schon in einem SQL Query zu laufen bekommen. Dies sieht dann so aus:
Code:
declare @sql varchar(8000)
select @sql ='bcp "SELECT * FROM TestDB.dbo.Table" queryout

C:/PDF_Out/Table.csv -c -t; -T -S' + @@SERVERNAME
exec master..xp_cmdshell @sql

Zur Zeit probiere ich das ganze zusammen zufügen, es gibt aber immer wieder Probleme an der Stelle COALESCE(@colnames + ';', '') Dort wo das ; ist.
Code:
declare @sql varchar(8000)
declare @colnames VARCHAR(max)
declare @BCP_EXPORT_DB VARCHAR(max)
set @BCP_EXPORT_DB = 'TestDB'
declare @BCP_EXPORT_TABLE  VARCHAR(max)
set @BCP_EXPORT_TABLE = 'Table'
select @sql ='BCP "SELECT @colnames = COALESCE(@colnames + ';', '') + column_name from %BCP_EXPORT_DB%.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=BCP_EXPORT_TABLE; select @colnames;" queryout C:/PDF_Out/HeadersOnly.csv -c -T' + @@SERVERNAME
exec master..xp_cmdshell @sql

Irgendwie hat er Probleme mit dem ; Ich vermute ich habe ein Hochkomma Problem oder so ähnlich. Hat einer von euch eine Idee
 
Werbung:
Ja du musst das Hochkomma escapen damit es nicht als Hochkomma und Ende der Zeichenkette sondern als Bestandteil der Zeichenkette gilt. Das kann man z.B. machen in dem man das Hochkomma einfach an den betreffenden Stellen verdoppelt:
Code:
select @sql ='BCP "SELECT @colnames = COALESCE(@colnames + '';'', '''') + column_name from %BCP_EXPORT_DB%.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=BCP_EXPORT_TABLE; select @colnames;" queryout C:/PDF_Out/HeadersOnly.csv -c -T' + @@SERVERNAME
Alternativ kann man beim Verketten auch mit CHAR(39) arbeiten um ein Hochkomma anzuhängen.
 
Hi Ukulele,

das hatte ich auch schon mal probiert mit dem doppelten Hochkomma, also so
Code:
select @sql ='BCP "SELECT @colnames = COALESCE(@colnames + '';'', '''') + column_name from %BCP_EXPORT_DB%.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=BCP_EXPORT_TABLE; select @colnames;" queryout C:/PDF_Out/HeadersOnly.csv -c -T' + @@SERVERNAME

Nun bekomme ich aber den Fehler BCP Unknown Option W. Ich finde aber keine Option W die ich gesetzt habe. Erst dachte ich es liegt vielleicht am Where befehl aber auch wenn ich dort das w entferne bleibt immer noch das gleiche Problem.
Vielleicht probier ich mal ein wenig mit Char(39). Falls du noch eine Idee hast würde ich mich freuen.
 
Ich bin jetzt was BCP angeht auch nicht so sicher aber was du da abschickst entspricht:
Code:
SELECT @colnames = COALESCE(@colnames + ';', '') + column_name from %BCP_EXPORT_DB%.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=BCP_EXPORT_TABLE; select @colnames;
Warum schreibst du nicht
Code:
SELECT COALESCE(@colnames + ';', '') + column_name from %BCP_EXPORT_DB%.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME=BCP_EXPORT_TABLE;
Und muss BCP_EXPORT_TABLE vieleicht auch in % stehen oder sind das keine Variablen deines Scripts? Dann eventuell in Hochkomma...

Außerdem würde ich den Pfad C:/PDF_Out/HeadersOnly.csv ebenfalls in Anführungszeichen setzen.
 
Werbung:
******* Closed******

Das Problem ist behoben, ich wollte mich nur nochmal melden falls der nächste das gleiche Problem hat.

Code:
declare @BCP_EXPORT_TABLE AS Char(25) = 'Table';
DECLARE @bcp_cmd4 VARCHAR(1000);
DECLARE @exe_path4 VARCHAR(200) =
    ' cd C:\Program Files\Microsoft SQL Server\110\Tools\Binn\ & ';
SET @bcp_cmd4 =  @exe_path4 +
    'BCP.exe "DECLARE @colnames VARCHAR(max);SELECT @colnames = COALESCE(@colnames + '';'', '''') + column_name from DB.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='''+@BCP_EXPORT_TABLE+'''; select @colnames;" queryout "C:/PDF_Out/HeadersOnly.csv" -c -T';

exec xp_cmdshell @bcp_cmd4;

SET @bcp_cmd4 =  @exe_path4 +
    'BCP.exe DB.dbo.'+@BCP_EXPORT_TABLE+' out "C:\PDF_Out\TableDataWithoutHeaders.csv" -c -t; -T';

exec xp_cmdshell @bcp_cmd4;

exec xp_cmdshell 'copy /b /Y "C:\PDF_Out\HeadersOnly.csv"+"C:\PDF_Out\TableDataWithoutHeaders.csv" "C:\PDF_Out\Table.csv"'

exec xp_cmdshell 'del "C:\PDF_Out\HeadersOnly.csv"'
exec xp_cmdshell 'del "C:\PDF_Out\TableDataWithoutHeaders.csv"'
 
Zurück
Oben