2009-08-31 9 views
27

Ho visto un numero di hack per provare a ottenere l'utilità bcp per esportare i nomi delle colonne insieme ai dati. Se tutto ciò che sto facendo è scaricare una tabella in un file di testo qual è il metodo più semplice per fare in modo che bcp aggiunga le intestazioni delle colonne?tabella di esportazione da archiviare con intestazioni di colonna (nomi di colonna) utilizzando l'utilità bcp e SQL Server 2008

Ecco il comando bcp Attualmente sto usando:

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

risposta

32

Il metodo più semplice è quello di utilizzare l'opzione queryout e utilizzare union all per collegare un elenco di colonne con il contenuto tabella effettiva

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

Un esempio:

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) 

Questa query restituirà le informazioni con il intestazioni come prima riga. (Notare i calchi dei valori numerici)

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

Il comando bcp sarà:

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 
+1

Genera un errore: Conversione non riuscita durante la conversione del valore varchar 'COL001' nel tipo di dati int. – Galled

+1

Ho aggiunto un esempio che contiene valori numerici. È necessario eseguire il cast delle colonne numeriche su varchar (o nvarchar) –

+1

La clausola Order By non funziona! – Srinivas

2

Da quel che ne so, BCP esporta solo i dati - non credo che ci sia alcun modo per farlo esportare la riga di intestazione con i nomi di colonna, pure.

Una tecnica comune visto per risolvere questo è quello di utilizzare una vista sui dati effettivi per l'esportazione, che fa fondamentalmente un UNION ALL in due affermazioni:

  • la prima dichiarazione di restituire una riga con la colonna intestazioni
  • i dati reali siano esportazione

e quindi utilizzare BCP su questo punto di vista, invece della tabella dati sottostanti direttamente.

Marc

2

Così come la soluzione da marc_s, è anche possibile utilizzare osql o sqlcmd

Questo include le intestazioni e può agire come BCP utilizzando -Q e -o. Tuttavia, non supportano i file di formato come bcp.

34

Questo metodo fornisce in uscita automaticamente nomi di colonna con i dati di riga utilizzando BCP.

Lo script scrive un file per le intestazioni di colonna (letto dalla tabella INFORMATION_SCHEMA.COLUMNS) quindi aggiunge un altro file con i dati della tabella.

L'output finale è combinato in TableData.csv che contiene le intestazioni e i dati di riga. Basta sostituire le variabili di ambiente in alto per specificare il nome del server, del database e della tabella.

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 

Nota che se è necessario fornire le credenziali, sostituire l'opzione -T con -U my_username -P my_password

Questo metodo ha il vantaggio di avere sempre i nomi delle colonne in sincronia con la tabella utilizzando INFORMATION_SCHEMA.COLUMNS. Il rovescio della medaglia è che crea file temporanei.Microsoft dovrebbe davvero risolvere l'utilità bcp per supportare questo.

Questa soluzione utilizza il trucco SQL fila concatenazione da here combinata con le idee BCP da here

+0

Uso 'select substring (@ colnames, 2,1000000000);' invece di 'selezionare @colnames;' perché la variabile '@ colnames' viene stampata con una coma all'inizio delle intestazioni. – Galled

+1

Tizio script impressionante. Vorrei votare due volte se potessi. Un modo per rendere i nomi delle tabelle e dei database come variabili di script batch? – CrazyTim

+0

@CrazyTim, ho reso le variabili env dei nomi per facilità d'uso. Sono contento che ti sia utile. –

6

stavo cercando di capire come fare questo di recente e mentre mi piace la soluzione più popolare in alto, semplicemente non sarebbe lavoro per me perché avevo bisogno che i nomi fossero gli pseudonimi che inserivo nello script, quindi ho usato alcuni file batch (con l'aiuto di un collega) per realizzare nomi di tabelle personalizzate.

Il file batch che avvia il bcp ha una linea nella parte inferiore dello script che esegue un altro script che unisce un file modello con i nomi delle intestazioni e il file che è stato appena esportato con bcp utilizzando il codice seguente. Spero che questo aiuti qualcun altro che era nella mia situazione.

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 
+0

Questa è la migliore risposta. Ricorda che non devi farlo da un file batch, puoi anche chiamare il comando copy usando 'xp_cmdshell', se è così che stai chiamando BCP. – Steve

7

Una buona alternativa è SQLCMD, dal momento che include le intestazioni, ma ha lo svantaggio di aggiungere spazio imbottitura attorno i dati per la leggibilità umana. È possibile combinare SqlCmd con l'utility GnuWin32 sed (modifica del flusso) per pulire i risultati. Ecco un esempio che ha funzionato per me, anche se non posso garantire che sia a prova di proiettile.

In primo luogo, l'esportazione dei dati:

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

Il -s" " è un carattere di tabulazione tra doppi apici. Ho scoperto che devi eseguire questo comando tramite un file batch, altrimenti il ​​prompt dei comandi di Windows considererà la scheda come un comando di completamento automatico e sostituirà un nome file al posto della scheda.

Se query.sql contiene:

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

allora vedrete qualcosa di simile in Risultati.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) 

Avanti, analizzare il testo utilizzando 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 

Si noti che il comando 2d significa eliminare la seconda riga, il comando $d significa eliminare l'ultima riga e "/^$/d" elimina le righe vuote.

Il file ripulito si presenta così (anche se ho sostituito le linguette con | in modo che potessero essere visualizzate qui):

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 
3

ho avuto lo stesso problema. Avevo bisogno di esportare l'intestazione della colonna usando l'utilità bcp del server SQL. In questo modo ho esportato le "intestazioni" della tabella con i dati nello stesso file esportato in una volta sola.

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

Buon codifica :) versioni

+0

cosa succede se i tipi di dati sono diversi – MichaelEvanchik

1

Di tutti fanno le cose un po 'diverse. Questa è la versione che ho sviluppato nel corso degli anni. Questa versione sembra tenere conto di tutti i problemi che ho riscontrato. Inserisci semplicemente un set di dati in una tabella, quindi passa il nome della tabella a questa stored procedure.

Io chiamo questa stored procedure in questo modo:

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*' 

Ci sono anche altre due variabili:

  • @NullBlanks - Questo richiederà qualsiasi campo che non ha un valore e null it. Questo è utile perché nel vero senso della specifica CSV ogni punto di dati dovrebbe avere delle virgolette intorno a loro. Se hai un set di dati di grandi dimensioni questo ti farà risparmiare una discreta quantità di spazio da non avendo "" (due virgolette doppie) in quei campi. Se non lo trovi utile, impostalo su 0.
  • @IncludeHeaders - Ho una stored procedure per l'output dei file CSV , quindi ho questo flag nell'evento in cui non voglio intestazioni.

Questo creerà la stored procedure:

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) 
0

Si può fare lo stesso con una stored procedure.

--Create stored procedure 
CREATE PROCEDURE [dbo].[spTest] 
AS 
BEGIN 
SELECT 'Name','ID','Created' 
UNION ALL 
    SELECT name, convert(nvarchar,database_id), convert(nvarchar,create_date) 
    FROM sys.databases 
END 
GO 

Quindi creare un processo di agente SQL con un passaggio CmdExec. Questo eseguirà la stored procedure e creerà un file csv nella posizione specificata.

bcp "EXEC DatabaseNameHere.dbo.spTest" queryout "\\IPAddressHere\c$\temp\testFile.csv" -T -c -t, 
+0

i tuoi campi capita di essere lo stesso tipo di dati – MichaelEvanchik

0

Ho raggiunto questo risultato con il seguente codice. Mettere sotto il codice in una nuova finestra di query SQL Server e provare

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

Si dovrebbe essere in grado di risolvere questo problema con una vista CTE e un file batch che contiene il codice BCP. Prima crea la vista. Dal momento che, le sue previsioni relativamente semplice, non ho creato una tabella temporanea, di solito lo faccio

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 

Ora, creare il file batch. L'ho creato nella mia directory Temp ma sono pigro.

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 

Il codice di cui sopra solo crea una data da aggiungere alla fine del file .. Successivamente, la prima istruzione BCP con la vista al CTE ricorsiva per concatenare tutti insieme.

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 

Ora si fondono insieme usando il comando copy

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

tutto pronto

2

Ecco una stored procedure piuttosto semplice che fa il trucco come pure ..

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 
1

L'ultima versione di sqlcmd aggiunge l'opzione -w per rimuovere ulteriore spazio dopo il valore del campo ; tuttavia, NON mette virgolette attorno alle stringhe, il che può essere un problema su CSV quando si importa un valore di campo che contiene una virgola.

-1

Si prega di trovare sotto un altro modo per fare la stessa cosa.Questa procedura accetta anche un parametro nel nome dello schema nel caso sia necessario per accedere alla tabella.

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 
Problemi correlati