선택 결과를 CSV 파일에 쓰기


37

SELECT 쿼리 결과를 csv 파일에 작성해야합니다. SQL Server 2008 r2에서 T-SQL을 사용하여 어떻게 수행 할 수 있습니까? SSIS에서 수행 할 수 있다는 것을 알고 있지만 어떤 이유로 든이 옵션이 없습니다.

아래 기사에서 제안 된 proc을 사용하려고했지만 proc을 실행할 때 SQL 은이 proc에서 호출되는 sys.sp_OACreate 및 sys.sp_OADestroy를 실행할 수 없다고 불평합니다.

이러한 구성 요소를 설정하는 방법을 알고 있거나 T-SQL을 사용하여 파일에 쓰는 더 좋은 방법을 알고 있습니까?

미리 감사드립니다.

답변:


52

BCP 유틸리티 사용

bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T

-c인수 는 SQL의 고유 이진 형식과 달리 c haracter 출력을 지정 합니다. 이 탭 값을 구분 디폴트하지만 -t ,필드 변경 t의 쉼표에 erminator한다. -T지정 Windows 인증 ( " t 녹슨 연결"), 그렇지 않으면 사용 -U MyUserName -P MyPassword.

기본적으로 열 헤더는 내 보내지 않습니다. 헤더에는 UNION ALL을 사용해야합니다.

또는

SQLCMD 사용

SQLCMD -S SERVERNAME -E -Q "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable"
-s "," -o "D:\MyData.csv" 

또는

Powershell 사용

다음은 기사에 대한 링크 입니다. 당신이 이것을 사용하게되면, 당신은 추가 할 수 있습니다 -notypeExport-Csv $extractFile출력 파일에 불필요한 열을 제거하는.


4
+1 BCP 유틸리티의 경우-사용이 매우 쉽고 정보 내보내기 / 가져 오기에 사용한 가장 빠른 도구이며 많은 옵션이 있습니다. 명령문 끝에 "> FileName.log"를 추가하도록 조언합니다. 그러면 로그 파일이 생성됩니다.
gotqn

24

이전 답변에 추가하여 작업을 자동화하는 데 도움이됩니다. Management Studio에서 작업을 수행 할 수있는 경우에만 필요한 경우 헤더마우스 오른쪽 단추로 클릭하고 다른 이름으로 결과 저장-> .csv 파일 선택을 클릭하십시오 .

또는 실행하는 각 select 문에 대해이를 수행하려면 결과의 출력 방향을 파일로 변경할 수 있습니다. 사용 도구 -> 옵션 -> 쿼리 결과 - 파일에 결과 .

쉽게 자동화 할 수 있고 SSIS를 사용하는 다른 방법은 Management Studio의 데이터 내보내기 기능을 사용하는 것입니다. 데이터베이스-> 작업-> 데이터 내보내기를 마우스 오른쪽 단추로 클릭하십시오. 많은 옵션이있는 마법사가 있습니다. 소스 데이터베이스, 대상 및 기타 옵션을 선택해야합니다. 대상의 경우 "플랫 파일"인지 확인하고 .csv 유형을 찾아서 선택하고 필요한 형식을 선택하면 결국 로컬에 저장하고 필요에 따라 반복 할 수있는 SSIS 패키지를 얻을 수 있습니다.


10

T-SQL 사용

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

그러나 몇 가지주의 사항이 있습니다.

  1. Microsoft.ACE.OLEDB.12.0 공급자를 사용할 수 있어야합니다. Jet 4.0 공급자도 작동하지만 고대 버전이므로 대신 이것을 사용했습니다.
  2. .CSV 파일이 이미 존재해야합니다. 헤더 (HDR = YES)를 사용하는 경우 .CSV 파일의 첫 번째 행이 모든 필드의 구분 된 목록인지 확인하십시오.

1
지금까지 가장 좋은 답변!
ajeh

1
경고를 포함한 훌륭한 직업
JJS

5

낮은 기술이지만 ...

select
   col1 + ','
+  cast(col2 as varchar(10)) + ','
+  col3
from mytable;

MySQL은 col1 + ',' + cast(col2 as varchar(10)) + ',' + col3열 이름으로 취급 하고 모든 곳에서 NULL을 인쇄합니다.
Nikhil Wagh

4

이미 수용 가능한 솔루션이있는 것처럼 보이지만 db 메일이 설정되어 있으면 다음과 같이 할 수 있습니다.

EXEC msdb.dbo.sp_send_dbmail
    @recipients='your.email@domain.com',
    @subject='CSV Extract', 
    @body='See attachment',
    @query ='SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable',
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'CSV_Extract.txt',
    @query_result_separator = ',',
    @query_result_header = 1

어쨌든 파일을 전자 메일로 보내는 경우 몇 단계를 줄일 수 있습니다.


내가 찾던 것, 당신에게 kudos!
Mashchax

사용자의 기본 개인 프로파일이나 데이터베이스의 공용 프로파일이없는 경우 @profile_name 매개 변수를 추가해야합니다.
Mashchax

1

이는 3 단계 프로세스로 쉽게 수행 할 수 있습니다.

  1. 쿼리를 쿼리로 작성하십시오 SELECT INTO. 기본적으로 쿼리 결과를 테이블로 내 보냅니다.

    Select
      Field1
     ,Field2
     ,Field3
    INTO dbo.LogTableName         --Table where the query Results get logged into.
    From Table
    

    이 유형의 쿼리는 실행의 일부로 테이블을 생성하려고하므로 쿼리가 실행될 때는 이 테이블이 존재할 수 없습니다 .

  2. 그런 다음 SSIS를 사용하여 해당 테이블의 결과를로 내보내십시오 .csv. SSIS 내보내기 마법사를 사용하면 구분 기호 등을 선택할 수 있습니다.이 기능은 | 결과 세트에 쉼표가 포함 된 경우 분리 문자.

    우클릭 DB Name > Tasks > Export Data

  3. 내보내기가 완료되면 DROP TABLE명령을 실행 하여 로그 테이블을 정리하십시오.

    Drop Table dbo.LogTableName

3
안녕 돈. 답변에 서식을 추가했습니다. 왼쪽 하단에서 '수정'을 클릭하면 변경된 내용을 확인하고 "수정 된 xx 분"비트를 클릭하여 롤백하려는 경우 전체 기록을 볼 수 있습니다. 이미 쓰여졌 고 많은 관심을 끌기
Michael Green

0

MS Access DoCMD를 사용하여 SQL Server에서 CSV를 내 보냅니다. 단일 명령으로 수행 할 수 있습니다. 액세스 데이터베이스는 액세스 명령을 활성화하는 데만 사용됩니다. 잘 수행되며 추가 이점 (왜 그런지 확실하지 않음)으로 내 보낸 테이블에 대한 schema.ini를 만듭니다.

아담

CMD="SELECT * INTO [Text;HDR=Yes;DATABASE=C:\].[Results.txt]  
FROM [ODBC;DSN=SQL2017;Description=SQL2017;UID=.;Trusted_Connection=Yes;APP=Microsoft Office 2013;WSID=LAPTOP-XYZ;DATABASE=TempDB_DataDump_1].Results "

 Set appAccess = CreateObject("Access.Application") 
                appAccess.OpenCurrentDatabase "anyAccessdatabase.mdb" 
                   ' appAccess.DoCmd.SetWarnings 0
                    appAccess.DoCmd.runsql "CMD"

-1

이 절차는 매개 변수로 전달한 쿼리의 출력으로 CSV 파일을 생성합니다. 두 번째 매개 변수는 CSV 파일 이름이므로 유효한 쓰기 가능 경로와 함께 파일 이름을 전달하십시오.

프로 시저를 작성하는 스크립트는 다음과 같습니다.

CREATE procedure [dbo].[usp_create_csv_file_from_query]
    @sql Nvarchar(MAX),
    @csvfile Nvarchar(200)
    as
    BEGIN
        if IsNull(@sql,'') = '' or IsNull(@csvfile,'') = ''
        begin
            RAISERROR ('Invalid SQL/CsvFile values passed!; Aborting...', 0, 1) WITH NOWAIT
            return
        end
        DROP TABLE if exists global_temp_CSVtable;
        declare 
            @columnList varchar(4000), 
            @columnList1 varchar(4000),
            @sqlcmd varchar(4000),
            @dos_cmd nvarchar(4000)

        set @sqlcmd = replace(@sql, 'from', 'into global_temp_CSVtable from')
        EXECUTE (@sqlcmd); 

        declare @cols table (i int identity, colname varchar(100))
        insert into @cols
        select column_name
        from information_schema.COLUMNS
        where TABLE_NAME = 'global_temp_CSVtable'

        declare @i int, @maxi int
        select @i = 1, @maxi = MAX(i) from @cols

        while(@i <= @maxi)
        begin
            select @sql = 'alter table global_temp_CSVtable alter column [' + colname + '] VARCHAR(max) NULL'
            from @cols
            where i = @i
            exec sp_executesql @sql
            select @i = @i + 1
        end

        SELECT 
             @columnList = COALESCE(@columnList + ''', ''', '') + column_name 
            ,@columnList1 = COALESCE(@columnList1 + ', ', '') + column_name
        from information_schema.columns
        where table_name =  'global_temp_CSVtable'
        ORDER BY ORDINAL_POSITION;

        SELECT @columnList = '''' + @columnList + '''';

        SELECT @dos_cmd='BCP "SELECT ' + @columnList + 
                        ' UNION ALL ' +
                        'SELECT * from ' + db_name() + '..global_temp_CSVtable" ' + 
                        'QUERYOUT ' + @csvfile + 
                        ' -c -t, -T'
        exec master.dbo.xp_cmdshell @dos_cmd, No_output 
        DROP TABLE if exists global_temp_CSVtable;
    end

2
코드 만 답변이 여기에 허용되는 것으로 보이지 않습니다. 답변에 대한 해설을 추가하고 왜 작동합니까? (코드 주석도 여기에 도움이 될 것입니다)
George.Palacios

예, 어떻게 성공적으로 사용하는지 예제를 추가 할 수 있습니까?
Marcello Miorelli
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.