2009-08-31 24 views

Odpowiedz

32

Najłatwiej jest użyć opcji queryout i używać union all połączyć listę kolumn z rzeczywistą zawartością tabeli

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

Przykład:

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) 

To zapytanie zwróci informację z nagłówki jako pierwszy wiersz. (Uwaga odlewy wartościami liczbowymi)

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

BCP polecenia będą:

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

Zgłasza błąd: Konwersja nie powiodła się podczas przekształcania wartości varcharowej "COL001" na typ danych int. – Galled

+1

Dodałem przykład, który zawiera wartości liczbowe. Musisz rzucić kolumny liczbowe do varchar (lub nvarchar) –

+1

Klauzula Order By nie działa! – Srinivas

2

Z tego co wiem, tylko BCP eksportuje dane - Nie sądzę, że istnieje jakikolwiek sposób, aby wyeksportować wiersz nagłówka z nazwami kolumn, także.

Jeden wspólny technika widać rozwiązania tego problemu jest użycie widok nad swoimi rzeczywistymi danymi na eksport, który w zasadzie robi UNION ALL ponad dwa oświadczenia:

  • pierwsze pismo oddać jeden wiersz z kolumny nagłówki
  • rzeczywiste dane za eksport

a następnie użyć bcp na tym widoku, zamiast swojej podstawowej tabeli danych bezpośrednio.

Marc

2

jak również rozwiązanie z marc_s, można również użyć osql lub sqlcmd

ta obejmuje nagłówki i może działać jak bcp z wykorzystaniem -D i -O. Nie obsługują jednak plików w formacie bcp.

34

Metoda ta automatycznie wyprowadza nazwy kolumn z danymi rzędu przez BCP.

Skrypt zapisuje jeden plik dla nagłówków kolumn (odczytany z tabeli INFORMATION_SCHEMA.COLUMNS), a następnie dołącza inny plik z danymi tabeli.

Końcowy wynik jest łączony w TableData.csv, który zawiera dane nagłówków i wierszy. Wystarczy wymienić zmienne środowiskowe u góry, aby określić nazwę serwera, bazy danych i tabeli.

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 

Zauważ, że jeśli trzeba dostarczyć poświadczenia, należy wymienić opcję -T z -U my_username -P my_password

Metoda ta ma tę zaletę, że zawsze o nazwy kolumn w synchronizacji z tabeli za pomocą INFORMATION_SCHEMA.COLUMNS. Minusem jest to, że tworzy pliki tymczasowe.Microsoft powinien naprawdę naprawić narzędzie bcp, aby to wspierać.

Rozwiązanie to wykorzystuje trik SQL rząd konkatenacji z here połączeniu z pomysłów bcp z here

+0

Używam 'select substring (@ colnames, 21000000000);' zamiast 'select @colnames;', ponieważ zmienna '@ colnames' jest drukowana ze śpiączką na początku nagłówków. – Galled

+1

Awesome script dude. Chciałbym dwukrotnie głosować, gdybym mógł. W jaki sposób utworzyć nazwy tabel i baz danych jako zmienne skryptu wsadowego? – CrazyTim

+0

@CrazyTim, Zrobiłem nazwy zmiennych env dla łatwości użycia. Cieszę się, że przydaje się tobie. –

6

starałem się dowiedzieć, jak to zrobić niedawno i choć lubię najbardziej popularne rozwiązanie na górze, to po prostu nie będzie pracuj dla mnie, ponieważ potrzebowałem nazw, aby były aliasami, które wpisałem w skrypcie, więc użyłem kilku plików wsadowych (z pomocą kolegi), aby uzyskać niestandardowe nazwy tabel.

Plik wsadowy, który inicjuje plik bcp, zawiera wiersz na dole skryptu, który wykonuje inny skrypt, który łączy plik szablonu z nazwami nagłówków i pliku, który został wyeksportowany za pomocą programu bcp, korzystając z poniższego kodu. Mam nadzieję, że to pomoże komuś innemu w mojej sytuacji.

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

To jest najlepsza odpowiedź. Pamiętaj tylko, że nie musisz tego robić z pliku wsadowego, możesz również wywołać komendę kopiowania za pomocą 'xp_cmdshell', jeśli tak właśnie nazywasz BCP. – Steve

7

Dobrą alternatywą jest Sqlcmd, ponieważ nie zawierają nagłówki, ale ma wadę dodawania przestrzeń wyściółki wokół danych dla ludzi czytelności. Możesz połączyć SqlCmd z narzędziem GnuWin32 sed (edycja strumieniowa), aby oczyścić wyniki. Oto przykład, który sprawdził się we mnie, choć nie mogę zagwarantować, że jest kuloodporny.

pierwsze, eksport danych:

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

-s" " to znak tabulatora w cudzysłowach. Zauważyłem, że musisz uruchomić to polecenie za pomocą pliku wsadowego, w przeciwnym razie wiersz polecenia systemu Windows potraktuje kartę jako polecenie automatycznego uzupełniania i zastąpi nazwę pliku zamiast karty.

Jeśli Query.sql zawiera:

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

wtedy zobaczysz coś takiego w 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) 

Następnie przetwarza tekst za pomocą 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 

Należy zauważyć, że polecenie 2d oznacza usunięcie drugiej linii, komendy $d oznacza usunięcie ostatniej linii, a "/^$/d" usuwa wszystkie puste wiersze.

wyczyszczoną plik wygląda tak (choć zastąpić zaczepy z | więc mogą one być wizualizowane tutaj):

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

miałem ten sam problem. Musiałem wyeksportować nagłówek kolumny za pomocą narzędzia bcp serwera SQL. W ten sposób wyeksportowałem tabelę "nagłówków" z danymi do tego samego eksportowanego pliku za jednym razem.

 
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 

Szczęśliwy kodowania :) wersje

+0

co, jeśli typy danych są różne? – MichaelEvanchik

1

wszystkich osĂłb robić rzeczy trochę inaczej. To jest wersja, którą rozwinąłem przez lata. Ta wersja wydaje się odpowiadać za wszystkie napotkane problemy. Po prostu wypełnij zestaw danych w tabeli, a następnie prześlij nazwę tabeli do tej procedury składowanej.

zgłoszę tę procedurę przechowywaną tak:

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

Istnieją również dwa inne zmienne:

  • @NullBlanks - To zajmie żadnego pola, które nie mają wartości i zeruj to. Jest to użyteczne, ponieważ w prawdziwym znaczeniu specyfikacji każdy punkt danych powinien zawierać cytaty. Jeśli masz duży zbiór danych, zaoszczędzisz sporo miejsca przez bez "" (dwóch podwójnych cudzysłowów) w tych polach. Jeśli nie uznasz tego za użyteczne, ustaw go na 0.
  • @IncludeHeaders - Mam jedną przechowywaną procedurę do wyprowadzania plików CSV , więc mam tę flagę, jeśli nie chcę nagłówków.

To stworzy procedury przechowywanej:

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

Można zrobić to samo z procedury przechowywanej.

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

Następnie należy utworzyć zadanie agenta SQL z krokiem CmdExec. Spowoduje to wykonanie procedury przechowywanej i utworzenie pliku csv w określonej lokalizacji.

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

Twoje pola są tym samym typem danych. – MichaelEvanchik

0

Udało mi się to osiągnąć za pomocą poniższego kodu. Put poniżej kodu w SQL Server nowym oknie zapytań i spróbuj

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

Powinieneś być w stanie rozwiązać ten problem z jednym widoku cte i jednego pliku wsadowego zawierającego kod BCP. Najpierw utwórz widok. Ponieważ nie był to względnie prosty, nie utworzyłem tabeli tymczasowej, zwykle robię:

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 

Teraz utwórz plik wsadowy. Stworzyłem to w moim katalogu Temp, ale jestem leniwy.

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 

Powyższy kod tworzy właśnie datę do dołączania do końca pliku .. Następnie, pierwsze pismo bcp z widokiem na rekurencyjnej CTE żeby połączyć to wszystko razem.

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 

teraz połączyć je ze sobą za pomocą polecenia copy

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

wszystko ustawione

2

Tutaj jest dość prosta procedura przechowywana, która załatwia sprawę jak dobrze ..

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

Najnowsza wersja programu sqlcmd dodaje opcję -w, aby usunąć dodatkową przestrzeń po wartości pola ; jednak NIE umieszcza cytatów wokół ciągów, co może być problemem w CSV podczas importowania wartości pola zawierającej przecinek.

-1

Poniżej znajduje się inny sposób na zrobienie tego samego.Ta procedura przyjmuje również parametr nazwy schematu na wypadek, gdyby był potrzebny do uzyskania dostępu do tabeli.

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 
Powiązane problemy