wake-up-neo.net

exportieren von Tabellen in eine Datei mit Spaltenüberschriften (Spaltennamen) mithilfe des Dienstprogramms "bcp" und von SQL Server 2008

Ich habe eine Reihe von Hacks gesehen, um zu versuchen, das bcp-Dienstprogramm dazu zu bringen, Spaltennamen zusammen mit den Daten zu exportieren. Wenn ich nur eine Tabelle in eine Textdatei ausgeben möchte, was ist die einfachste Methode, um bcp die Spaltenüberschriften hinzufügen zu lassen?

Hier ist der bcp-Befehl, den ich derzeit verwende:

bcp myschema.dbo.myTableout myTable.csv /SmyServer01 /c /t, -T
33
JD Long

Am einfachsten ist es, die Option queryout zu verwenden und mit union all eine Spaltenliste mit dem eigentlichen Tabelleninhalt zu verknüpfen

    bcp "select 'col1', 'col2',... union all select * from myschema.dbo.myTableout" queryout myTable.csv /SmyServer01 /c /t, -T

Ein Beispiel:

create table Question1355876 
(id int, name varchar(10), someinfo numeric)

insert into Question1355876 
values (1, 'a', 123.12)
     , (2, 'b', 456.78)
     , (3, 'c', 901.12)
     , (4, 'd', 353.76)

Diese Abfrage gibt die Informationen mit den Kopfzeilen als erste Zeile zurück. (Beachten Sie die Abgüsse der numerischen Werte)

select 'col1', 'col2', 'col3'
union all
select cast(id as varchar(10)), name, cast(someinfo as varchar(28))
from Question1355876

Der Befehl bcp lautet:

bcp "select 'col1', 'col2', 'col3' union all select cast(id as varchar(10)), name, cast(someinfo as varchar(28)) from Question1355876" queryout myTable.csv /SmyServer01 /c /t, -T
39
Filip De Vos

Diese Methode gibt automatisch Spaltennamen mit Ihren Zeilendaten aus, indem Sie BCP verwenden.

Das Skript schreibt eine Datei für die Spaltenüberschriften (aus INFORMATION_SCHEMA.COLUMNS-Tabelle gelesen) und fügt dann eine weitere Datei mit den Tabellendaten hinzu.

Die endgültige Ausgabe wird in TableData.csv zusammengefasst, der die Kopf- und Zeilendaten enthält. Ersetzen Sie einfach die Umgebungsvariablen oben, um den Namen des Servers, der Datenbank und der Tabelle anzugeben.

set BCP_EXPORT_SERVER=put_my_server_name_here
set BCP_EXPORT_DB=put_my_db_name_here
set BCP_EXPORT_TABLE=put_my_table_name_here

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 HeadersOnly.csv -c -T -S%BCP_EXPORT_SERVER%

BCP %BCP_EXPORT_DB%.dbo.%BCP_EXPORT_TABLE% out TableDataWithoutHeaders.csv -c -t, -T -S%BCP_EXPORT_SERVER%

set BCP_EXPORT_SERVER=
set BCP_EXPORT_DB=
set BCP_EXPORT_TABLE=

copy /b HeadersOnly.csv+TableDataWithoutHeaders.csv TableData.csv

del HeadersOnly.csv
del TableDataWithoutHeaders.csv

Wenn Sie Anmeldeinformationen angeben müssen, ersetzen Sie die Option -T durch -U mein_Benutzername -P mein_Kennwort

Diese Methode hat den Vorteil, dass die Spaltennamen immer mit der Tabelle synchronisiert werden, indem INFORMATION_SCHEMA.COLUMNS verwendet wird. Der Nachteil ist, dass temporäre Dateien erstellt werden. Microsoft sollte das bcp-Dienstprogramm wirklich korrigieren, um dies zu unterstützen.

Diese Lösung verwendet den SQL-Zeilenverkettungs-Trick aus hier in Kombination mit bcp-Ideen aus hier

42
Dylan Hogg

Eine gute Alternative ist SqlCmd, da es Kopfzeilen enthält, aber es hat den Nachteil, dass die Daten zur besseren Lesbarkeit mit Leerzeichen versehen werden. Sie können SqlCmd mit dem GnuWin32-Dienstprogramm sed (Stream-Bearbeitung) kombinieren, um die Ergebnisse zu bereinigen. Hier ist ein Beispiel, das für mich funktioniert hat, obwohl ich nicht garantieren kann, dass es kugelsicher ist. 

Exportieren Sie zuerst die Daten: 

sqlcmd -S Server -i C:\Temp\Query.sql -o C:\Temp\Results.txt -s"    "

Der -s" " ist ein Tabulatorzeichen in Anführungszeichen. Ich habe festgestellt, dass Sie diesen Befehl über eine Batchdatei ausführen müssen. Andernfalls behandelt die Windows-Eingabeaufforderung die Registerkarte als automatischen Abschlussbefehl und ersetzt anstelle der Registerkarte einen Dateinamen.

Wenn Query.sql enthält:

SELECT name, object_id, type_desc, create_date
FROM MSDB.sys.views
WHERE name LIKE 'sysmail%'

dann sehen Sie so etwas in Results.txt

name                                          object_id   type_desc           create_date            
-------------------------------------------   ----------- ------------------- -----------------------
sysmail_allitems                               2001442204 VIEW                2012-07-20 17:38:27.820
sysmail_sentitems                              2017442261 VIEW                2012-07-20 17:38:27.837
sysmail_unsentitems                            2033442318 VIEW                2012-07-20 17:38:27.850
sysmail_faileditems                            2049442375 VIEW                2012-07-20 17:38:27.860
sysmail_mailattachments                        2097442546 VIEW                2012-07-20 17:38:27.933
sysmail_event_log                              2129442660 VIEW                2012-07-20 17:38:28.040

(6 rows affected)

Als Nächstes analysieren Sie den Text mit sed:

sed -r "s/ +\t/\t/g" C:\Temp\Results.txt | sed -r "s/\t +/\t/g" | sed -r "s/(^ +| +$)//g" | sed 2d | sed $d | sed "/^$/d" > C:\Temp\Results_New.txt

Beachten Sie, dass der Befehl 2d das Löschen der zweiten Zeile bedeutet, der Befehl $d das Löschen der letzten Zeile bedeutet und "/^$/d" alle leeren Zeilen löscht.

Die bereinigte Datei sieht folgendermaßen aus (obwohl ich die Registerkarten durch | ersetzt habe, damit sie hier angezeigt werden können):

name|object_id|type_desc|create_date
sysmail_allitems|2001442204|VIEW|2012-07-20 17:38:27.820
sysmail_sentitems|2017442261|VIEW|2012-07-20 17:38:27.837
sysmail_unsentitems|2033442318|VIEW|2012-07-20 17:38:27.850
sysmail_faileditems|2049442375|VIEW|2012-07-20 17:38:27.860
sysmail_mailattachments|2097442546|VIEW|2012-07-20 17:38:27.933
sysmail_event_log|2129442660|VIEW|2012-07-20 17:38:28.040
8
Alchemistmatt

Ich habe erst kürzlich versucht herauszufinden, wie das geht, und obwohl ich die populärste Lösung an der Spitze mag, würde sie einfach nicht funktionieren, da ich die Namen als Aliasnamen verwenden musste, die ich in das Skript eingegeben habe, also einige Batch-Dateien (mit Hilfe eines Kollegen), um benutzerdefinierte Tabellennamen auszuführen. 

Die Stapeldatei, die das bcp initiiert, hat am Ende des Skripts eine Zeile, die ein anderes Skript ausführt, das eine Vorlagendatei mit den Namen der Header und der gerade mit bcp exportierten Datei unter Verwendung des folgenden Codes zusammenführt. Hoffe, das hilft jemand anderem, der in meiner Situation war.

echo Add headers from template file to exported sql files....
Echo School 0031
copy e:\genin\templates\TEMPLATE_Courses.csv + e:\genin\0031\courses0031.csv e:\genin\finished\courses0031.csv /b
6
Mysteri0n

Ich hatte das gleiche Problem. Ich musste den Spaltenkopf mit dem SQL Server-Dienstprogramm bcp exportieren. Auf diese Weise exportierte ich Tabellen- "Kopfzeilen" mit Daten in derselben exportierten Datei auf einmal.

 DECLARE @table_name VARCHAR (50) = 'mytable' 
 DECLARE @columnHeader VARCHAR (8000) 
 SELECT @columnHeader = COALESCE (@ columnHeader + ',' ') +' '+ Spaltenname + '' '' FROM Nal2013.INFORMATION_SCHEMA.COLUMNS WHERE [email protected]
SELECT @raw_sql = 'bcp "SELECT" + @columnHeader +' UNION ALL SELECT * FROM mytable "Abfrage c:\datafile.csv -c -t , -T -S '+ @@ servername 
 EXEC xp_cmdshell @raw_sql 

Viel Spaß beim Codieren :)

3

Hier ist eine ziemlich einfache gespeicherte Prozedur, die den Trick auch macht.

    CREATE PROCEDURE GetBCPTable
    @table_name varchar(200)
AS
BEGIN
    DECLARE @raw_sql nvarchar(3000)

    DECLARE @columnHeader VARCHAR(8000)
    SELECT @columnHeader = COALESCE(@columnHeader+',' ,'')+ ''''+column_name +'''' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table_name

    DECLARE @ColumnList VARCHAR(8000)
    SELECT @ColumnList = COALESCE(@ColumnList+',' ,'')+ 'CAST('+column_name +' AS VARCHAR)' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table_name

    SELECT @raw_sql = 'SELECT '+ @columnHeader +' UNION ALL SELECT ' + @ColumnList + ' FROM ' + @table_name 
    --PRINT @raw_SQL
    EXECUTE sp_executesql  @raw_sql
END
GO
2
Dan Sullivan

Soweit ich weiß, exportiert BCP nur die Daten. Ich glaube nicht, dass es eine Möglichkeit gibt, die Kopfzeile auch mit Spaltennamen zu exportieren.

Eine gängige Technik, um dieses Problem zu lösen, besteht darin, eine Ansicht über Ihre tatsächlichen Daten für den Export zu verwenden, die eine UNION ALL im Wesentlichen über zwei Anweisungen ausführt:

  • die erste Anweisung, die eine Zeile mit den Spaltenüberschriften zurückgibt
  • die tatsächlich zu exportierenden Daten

und verwenden Sie dann bcp für diese Ansicht, anstatt direkt Ihre zugrunde liegende Datentabelle.

Marc

2
marc_s

Neben der Lösung von marc_s können Sie auch osql oder sqlcmd verwenden.

Dies schließt Header ein und kann mit -Q und -o wie bcp wirken. Sie unterstützen jedoch keine Formatdateien wie bcp.

2
gbn

Alle Versionen machen etwas anders. Dies ist die Version, die ich im Laufe der Jahre entwickelt habe. Diese Version scheint alle Probleme zu berücksichtigen, auf die ich gestoßen bin. Füllen Sie einfach einen Datensatz in eine Tabelle ein und übergeben Sie den Tabellennamen an diese gespeicherte Prozedur.

Ich rufe diese gespeicherte Prozedur so auf:

EXEC    @return_value = *DB_You_Create_The_SP_In*.[dbo].[Export_CSVFile]
        @DB = N'*YourDB*',
        @TABLE_NAME = N'*YourTable*',
        @Dir = N'*YourOutputDirectory*',
        @File = N'*YourOutputFileName*'

Es gibt auch zwei weitere Variablen:

  • @NullBlanks - Dies nimmt jedes Feld, das keinen Wert hat, und Null. Dies ist nützlich, weil im richtigen Sinn der CSV-Spezifikation __ um jeden Datenpunkt Anführungszeichen stehen sollen. Wenn Sie Über einen großen Datensatz verfügen, sparen Sie eine ganze Menge Platz, da Ohne "" (zwei Anführungszeichen) in diesen Feldern steht. Wenn Sie das nicht nützlich finden, setzen Sie es auf 0.
  • @IncludeHeaders - Ich habe eine gespeicherte Prozedur zum Ausgeben von CSV-Dateien (__....). Ich habe also dieses Flag, falls ich keine Header möchte.

Dadurch wird die gespeicherte Prozedur erstellt:

CREATE PROCEDURE [dbo].[Export_CSVFile] 
(@DB varchar(128),@TABLE_NAME varchar(128), @Dir varchar(255), @File varchar(250),@NULLBLANKS bit=1,@IncludeHeader bit=1)
AS

DECLARE @CSVHeader varchar(max)=''  --CSV Header
, @CmdExc varchar(max)=''           --EXEC commands
, @SQL varchar(max)=''              --SQL Statements
, @COLUMN_NAME varchar(128)=''      --Column Names
, @DATA_TYPE varchar(15)=''         --Data Types

DECLARE @T table (COLUMN_NAME varchar(128),DATA_TYPE varchar(15))

--BEGIN Ensure Dir variable has a backslash as the final character
IF NOT RIGHT(@Dir,1) = '\' BEGIN SET @[email protected]+'\' END
--END

--BEGIN Drop TEMP Table IF Exists
SET @SQL='IF (EXISTS (SELECT * FROM '[email protected]+'.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ''TEMP_'[email protected]_NAME+''')) BEGIN EXEC(''DROP TABLE ['[email protected]+'].[dbo].[TEMP_'[email protected]_NAME+']'') END'
EXEC(@SQL)
--END

SET @SQL='SELECT COLUMN_NAME,DATA_TYPE FROM '[email protected]+'.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='''[email protected]_NAME+''' ORDER BY ORDINAL_POSITION'
INSERT INTO @T
EXEC (@SQL)

SET @SQL=''
WHILE exists(SELECT * FROM @T)
    BEGIN
        SELECT top(1) @DATA_TYPE=DATA_TYPE,@COLUMN_NAME=COLUMN_NAME FROM @T
        IF @DATA_TYPE LIKE '%char%' OR @DATA_TYPE LIKE '%text'
            BEGIN 
            IF @NULLBLANKS = 1
                BEGIN
                    SET @SQL+='CASE PATINDEX(''%[0-9,a-z]%'','[email protected]_NAME+') WHEN ''0'' THEN NULL ELSE ''"''+RTRIM(LTRIM('[email protected]_NAME+'))+''"'' END AS ['[email protected]_NAME+'],' 
                END
            ELSE
                BEGIN
                    SET @SQL+='''"''+RTRIM(LTRIM('[email protected]_NAME+'))+''"'' AS ['[email protected]_NAME+'],' 
                END
            END
        ELSE
            BEGIN SET @[email protected]_NAME+',' END
            SET @CSVHeader+='"'[email protected]_NAME+'",'
            DELETE top(1) @T
    END 

IF LEN(@CSVHeader)>1 BEGIN SET @CSVHeader=RTRIM(LTRIM(LEFT(@CSVHeader,LEN(@CSVHeader)-1))) END

IF LEN(@SQL)>1 BEGIN SET @SQL= 'SELECT '+ LEFT(@SQL,LEN(@SQL)-1) + ' INTO ['[email protected]+'].[dbo].[TEMP_'[email protected]_NAME+'] FROM ['[email protected]+'].[dbo].['[email protected]_NAME+']' END
EXEC(@SQL)

IF @IncludeHeader=0 
    BEGIN
        --BEGIN Create Data file
        SET  @CmdExc ='BCP "'[email protected]+'.dbo.TEMP_'[email protected]_NAME+'" out "'[email protected]+'Data_'[email protected]_NAME+'.csv" /c /t, -T' 
        EXEC master..xp_cmdshell @CmdExc
        --END
        SET  @CmdExc ='del '[email protected][email protected] EXEC master..xp_cmdshell @CmdExc
        SET  @CmdExc ='ren '[email protected]+'Data_'[email protected]_NAME+'.csv '[email protected] EXEC master..xp_cmdshell @CmdExc
    END 
else
    BEGIN

        --BEGIN Create Header and main file
        SET  @CmdExc ='echo '[email protected]+'> '[email protected][email protected] EXEC master..xp_cmdshell @CmdExc
        --END

        --BEGIN Create Data file
        SET  @CmdExc ='BCP "'[email protected]+'.dbo.TEMP_'[email protected]_NAME+'" out "'[email protected]+'Data_'[email protected]_NAME+'.csv" /c /t, -T' 
        EXEC master..xp_cmdshell @CmdExc
        --END

        --BEGIN Merge Data File With Header File
        SET @CmdExc = 'TYPE '[email protected]+'Data_'[email protected]_NAME+'.csv >> '[email protected][email protected] EXEC master..xp_cmdshell @CmdExc
        --END

        --BEGIN Delete Data File
        SET @CmdExc = 'DEL /q '[email protected]+'Data_'[email protected]_NAME+'.csv' EXEC master..xp_cmdshell @CmdExc
        --END
    END
--BEGIN Drop TEMP Table IF Exists
SET @SQL='IF (EXISTS (SELECT * FROM '[email protected]+'.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ''TEMP_'[email protected]_NAME+''')) BEGIN EXEC(''DROP TABLE ['[email protected]+'].[dbo].[TEMP_'[email protected]_NAME+']'') END'
EXEC(@SQL)
1
Matt Smith

Die neueste Version von sqlcmd fügt die Option -w hinzu, um nach dem Feldwert zusätzlichen Speicherplatz zu entfernen. Es werden jedoch KEINE Anführungszeichen um Strings gesetzt. Dies kann bei CSV ein Problem sein, wenn ein Feldwert importiert wird, der ein Komma enthält.

1
Steven Buehler

Mit einem kleinen PowerShell-Skript

sqlcmd -Q "set nocount on select top 0 * from [DB].[schema].[table]" -o c:\temp\header.txt 
bcp [DB].[schema].[table] out c:\temp\query.txt -c -T -S BRIZA
Get-Content c:\temp\*.txt | Set-Content c:\temp\result.txt
Remove-Item c:\temp\header.txt
Remove-Item c:\temp\query.txt

Warnung, dass die Verkettung dem Namen der TXT-Datei folgt (in alphabetischer Reihenfolge)

0
Brontomania

Ich habe dies mit dem folgenden Code erfolgreich erreicht. __ Geben Sie den Code in das neue Abfragefenster von SQL Server ein und versuchen Sie es

CREATE TABLE tempDBTableDetails ( TableName VARCHAR(500), [RowCount] VARCHAR(500), TotalSpaceKB VARCHAR(500),
                UsedSpaceKB VARCHAR(500), UnusedSpaceKB VARCHAR(500) )

    -- STEP 1 :: 
    DECLARE @cmd VARCHAR(4000)

INSERT INTO tempDBTableDetails
SELECT 'TableName', 'RowCount', 'TotalSpaceKB', 'UsedSpaceKB', 'UnusedSpaceKB'
INSERT INTO tempDBTableDetails
SELECT  
    S.name +'.'+ T.name as TableName, 
    Convert(varchar,Cast(SUM(P.rows) as Money),1) as [RowCount],
    Convert(varchar,Cast(SUM(a.total_pages) * 8 as Money),1) AS TotalSpaceKB, 
    Convert(varchar,Cast(SUM(a.used_pages) * 8 as Money),1) AS UsedSpaceKB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM sys.tables T
INNER JOIN sys.partitions P ON P.OBJECT_ID = T.OBJECT_ID
INNER JOIN sys.schemas S ON T.schema_id = S.schema_id
INNER JOIN sys.allocation_units A ON p.partition_id = a.container_id
WHERE T.is_ms_shipped = 0 AND P.index_id IN (1,0)
GROUP BY S.name, T.name
ORDER BY SUM(P.rows) DESC

-- SELECT * FROM [FIINFRA-DB-SIT].dbo.tempDBTableDetails ORDER BY LEN([RowCount]) DESC

SET @cmd = 'bcp "SELECT * FROM [FIINFRA-DB-SIT].dbo.tempDBTableDetails ORDER BY LEN([RowCount]) DESC" queryout "D:\Milind\export.xls" -U sa -P dbowner -c'
    Exec xp_cmdshell @cmd 

--DECLARE @HeaderCmd VARCHAR(4000)
--SET @HeaderCmd = 'SELECT ''TableName'', ''RowCount'', ''TotalSpaceKB'', ''UsedSpaceKB'', ''UnusedSpaceKB'''
exec master..xp_cmdshell 'BCP "SELECT ''TableName'', ''RowCount'', ''TotalSpaceKB'', ''UsedSpaceKB'', ''UnusedSpaceKB''" queryout "d:\milind\header.xls" -U sa -P dbowner -c'
exec master..xp_cmdshell 'copy /b "d:\Milind\header.xls"+"d:\Milind\export.xls" "d:/Milind/result.xls"'

exec master..xp_cmdshell 'del "d:\Milind\header.xls"'
exec master..xp_cmdshell 'del "d:\Milind\export.xls"'

DROP TABLE tempDBTableDetails 
0
Milind Nikam

Sie sollten in der Lage sein, dieses Problem mit einer Cte-Ansicht und einer Batch-Datei zu lösen, die den bcp-Code enthält. Erstellen Sie zuerst die Ansicht. Da es relativ einfach ist, habe ich keine temporäre Tabelle erstellt, normalerweise mache ich das

CREATE VIEW [dbo].[vwxMySAMPLE_EXTRACT_COLUMNS]
  AS
    WITH MYBCP_CTE (COLUMN_NM, ORD_POS, TXT)
     AS
      ( SELECT  COLUMN_NAME
             , ORDINAL_POSITION
             , CAST(COLUMN_NAME AS VARCHAR(MAX))
        FROM [INFORMATION_SCHEMA].[COLUMNS]   
        WHERE TABLE_NAME = 'xMySAMPLE_EXTRACT_NEW'
        AND ORDINAL_POSITION = 1

        UNION ALL

        SELECT  V.COLUMN_NAME
              , V.ORDINAL_POSITION
              , CAST(C.TXT + '|' + V.COLUMN_NAME AS VARCHAR(MAX))
        FROM [INFORMATION_SCHEMA].[COLUMNS]  V INNER JOIN MYBCP_CTE C
        ON V.ORDINAL_POSITION = C.ORD_POS+1
        AND V.ORDINAL_POSITION > 1
        WHERE TABLE_NAME = 'xMySAMPLE_EXTRACT_NEW'
      )

      SELECT CC.TXT
      FROM MYBCP_CTE CC INNER JOIN ( SELECT MAX(ORD_POS) AS MX_CNT
                                     FROM MYBCP_CTE C
                                    ) SC
      ON CC.ORD_POS = SC.MX_CNT

Erstellen Sie nun die Batchdatei. Ich habe dies in meinem Temp-Verzeichnis erstellt, bin aber faul.

  cd\ 
  CD "C:\Program Files\Microsoft SQL Server\110\Tools\Binn"

  set buildhour=%time: =0%
  set buildDate=%DATE:~4,10%
  set backupfiledate=%buildDate:~6,4%%buildDate:~0,2%%buildDate:~3,2%%time:~0,2%%time:~3,2%%time:~6,2%

  echo %backupfiledate%
  pause

Der obige Code erstellt lediglich ein Datum, das an das Ende Ihrer Datei angehängt werden soll. Als Nächstes wird die erste bcp-Anweisung mit der Ansicht des rekursiven Cte angezeigt, um alles miteinander zu verketten.

  bcp "SELECT *  FROM [dbo].[vwxMYSAMPLE_EXTRACT_COLUMNS] OPTION (MAXRECURSION 300)" queryout C:\Temp\Col_NM%backupfiledate%.txt -c -t"|" -S MYSERVERTOLOGINTO -T -q
  bcp "SELECT *  FROM [myDBName].[dbo].[vwxMYSAMPLE_EXTRACT_NEW] " queryout C:\Temp\3316_PHYSDATA_ALL%backupfiledate%.txt -c -t"|" -S MYSERVERTOLOGINTO -T -q

Verbinden Sie sie nun mit dem Befehl Kopieren

  copy C:\Temp\Col_NM%backupfiledate%.txt  + C:\Temp\3316_PHYSDATA_ALL%backupfiledate%.txt  C:\Temp\3316_PHYSDATA_ALL%backupfiledate%.csv

Alles bereit

0
Timothy Ultican

Nachfolgend finden Sie einen anderen Weg, um dasselbe zu erreichen. Bei dieser Prozedur wird im Parameter auch ein Schemaname angegeben, falls Sie diesen für den Zugriff auf Ihre Tabelle benötigen.

CREATE PROCEDURE Export_Data_NBA
@TableName nchar(50),
@TableSchema nvarchar(50) = ''

AS
DECLARE @TableToBeExported as nvarchar(50);

DECLARE @OUTPUT TABLE (col1 nvarchar(max));
DECLARE @colnamestable VARCHAR(max);
select @colnamestable = COALESCE(@colnamestable, '') +COLUMN_NAME+ ','
from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName
order BY ORDINAL_POSITION

SELECT @colnamestable = LEFT(@colnamestable,DATALENGTH(@colnamestable)-1)

INSERT INTO @OUTPUT
select @colnamestable

DECLARE @selectstatement VARCHAR(max);
select @selectstatement = COALESCE(@selectstatement, '') + 'Convert(nvarchar(100),'+COLUMN_NAME+')+'',''+'
from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName
order BY ORDINAL_POSITION

SELECT @selectstatement = LEFT(@selectstatement,DATALENGTH(@selectstatement)-1)

DECLARE @sqlstatment as nvarchar(max);

SET @TableToBeExported = @TableSchema+'.'[email protected]

SELECT @sqlstatment = N'Select '[email protected]+N' from '[email protected]

INSERT INTO @OUTPUT
exec sp_executesql @stmt = @sqlstatment

SELECT * from @OUTPUT
0
Nicolas

Ich habe eine Version basierend auf dem, was ich zuvor gesehen habe. Es hat mir sehr geholfen, Exportdateien als CSV oder TXT zu erstellen. Ich speichere eine Tabelle in einer ## Temp-Tabelle:

    IF OBJECT_ID('tempdb..##TmpExportFile') IS NOT NULL
DROP TABLE ##TmpExportFile;


DECLARE @columnHeader VARCHAR(8000)
DECLARE @raw_sql nvarchar(3000)

SELECT
              * INTO ##TmpExportFile
              ------ FROM THE TABLE RESULTS YOU WANT TO GET
              ------ COULD BE A TABLE OR A TEMP TABLE BASED ON INNER JOINS
              ------ ,ETC.

FROM TableName -- optional WHERE ....


DECLARE @table_name  VARCHAR(50) = '##TmpExportFile'
SELECT
              @columnHeader = COALESCE(@columnHeader + ',', '') + '''[' + c.name + ']''' + ' as ' + '' + c.name + ''
FROM tempdb.sys.columns c
INNER JOIN tempdb.sys.tables t
              ON c.object_id = t.object_id
WHERE t.NAME = @table_name

print @columnheader

                DECLARE @ColumnList VARCHAR(max)
SELECT
              @ColumnList = COALESCE(@ColumnList + ',', '') + 'CAST([' + c.name + '] AS CHAR(' + LTRIM(STR(max_length)) + '))'
FROM tempdb.sys.columns c
INNER JOIN tempdb.sys.tables t
              ON c.object_id = t.object_id
WHERE t.name = @table_name
print @ColumnList

--- CSV FORMAT                                       
SELECT
              @raw_sql = 'bcp "SELECT ' + @columnHeader + ' UNION all SELECT ' + @ColumnList + ' FROM ' + @table_name + ' " queryout \\networkdrive\networkfolder\datafile.csv -c -t, /S' + ' SQLserverName /T'
--PRINT @raw_sql
EXEC xp_cmdshell @raw_sql

  --- TXT FORMAT
       SET @raw_sql = 'bcp "SELECT ' + @columnHeader + ' UNION all SELECT ' + @ColumnList + ' FROM ' + @table_name + ' " queryout \\networkdrive\networkfolder\MISD\datafile.txt /c /S'+ ' SQLserverName /T'
       EXEC xp_cmdshell @raw_sql



DROP TABLE ##TmpExportFile
0
Robert Colon