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
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
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
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
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
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 :)
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
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:
und verwenden Sie dann bcp für diese Ansicht, anstatt direkt Ihre zugrunde liegende Datentabelle.
Marc
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:
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)
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.
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)
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
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
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
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