Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

BCP Storeprocedure Export

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Frase, 1 April 2016.

  1. Frase

    Frase Neuer Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

    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.
     
  3. Frase

    Frase Neuer Benutzer

    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.
     
  4. ukulele

    ukulele Datenbank-Guru

    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.
     
  5. Frase

    Frase Neuer Benutzer

    ******* 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"'
     
    Walter gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden