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

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

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

미리 감사합니다.

답변

BCP 유틸리티

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

-c 인수는 c SQL의 기본 바이너리 형식과 반대되는 haracter 출력. 기본값은 탭으로 구분 된 값이지만 -t , 필드 t 종료자를 쉼표로 변경합니다. -T는 Windows 인증 ( “ t rusted connection “), 그렇지 않으면 -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 사용

다음은 기사 링크 입니다. 이것을 사용하게되면 Export-Csv $extractFile 뒤에 -notype를 추가하여 출력 파일에서 불필요한 열을 제거 할 수 있습니다.

댓글

  • +1 BCP 유틸리티의 경우 사용하기가 매우 쉽고 내보내기 / 가져 오기에 사용했던 도구 중 가장 빠릅니다. 정보와 많은 옵션이 있습니다. 끝에 ” > FileName.log “를 추가하도록 조언합니다. 문-로그 파일을 생성합니다.
  • GUI 프로그램과 관련된 모든 답변은 범위를 벗어납니다. 이것은 DBA의 관점에서 볼 때 최상의 솔루션입니다!

답변

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

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

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

답변

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 파일의 첫 번째 줄이 모든 필드의 구분 된 목록인지 확인합니다.

댓글

  • 그렇습니다. 멀리!
  • 주의 사항을 포함한 훌륭한 작업
  • 한 가지 추가주의 사항 : 권한이 필요할 수 있습니다. 그렇지 않으면 다음과 같은 메시지가 표시됩니다. Msg 15281, Level 16, State 1, Line 2 SQL Server에서 액세스를 차단했습니다. 성명 ‘ OpenRowset / OpenDatasource ‘ 구성 요소 ‘ Ad Hoc 분산 쿼리 ‘이 구성 요소는이 서버에 대한 보안 구성의 일부로 해제되어 있기 때문입니다. 시스템 관리자는 sp_configure를 사용하여 ‘ Ad Hoc 분산 쿼리 ‘를 사용하도록 설정할 수 있습니다. ‘ Ad Hoc 분산 쿼리 ‘ 사용에 대한 자세한 내용을 보려면 ‘ Ad Hoc을 검색하세요. SQL Server 온라인 설명서의 분산 쿼리 ‘

답변

낮은 기술이지만 …

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

댓글

  • MySQL은 를 열 이름으로 사용하고 모든 곳에 NULL을 인쇄합니다.

답변

이미 허용 가능한 솔루션이있는 것 같지만 db 메일을 설정 한 경우 다음과 같은 작업을 수행 할 수 있습니다.

EXEC msdb.dbo.sp_send_dbmail @recipients="[email protected]", @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 

어쨌든 파일을 이메일로 보내는 경우 몇 단계를 절약 할 수 있습니다.

댓글

  • 내가 찾던 바로 그것입니다. 좋아요!
  • 기본 비공개 프로필이없는 경우 @profile_name 매개 변수를 추가해야합니다. 사용자 또는 데이터베이스의 공개 프로필을위한 것입니다.

답변

이 작업은 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 

댓글

  • 안녕하세요 Don. 답변에 서식을 추가했습니다. 왼쪽 하단에서 ‘ 수정 ‘을 클릭하여 ‘ 무엇을 볼 수 있습니다. 변경하고 ” 수정 된 ” xx 분 ” 비트를 클릭하여 전체 기록을 확인하세요. 롤백하려는 경우. 실행 가능하지만 귀하의 답변은 ‘ 이미 작성된 내용보다 ‘ 많이 추가되지 않으며 많은 관심을 끌 가능성이 낮습니다.

답변

이 절차는 매개 변수로 전달한 쿼리의 출력이 포함 된 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 

설명

  • 코드 전용 답변은 ‘ 여기에서 허용되는 것으로 간주되지 않습니다. 답변에 대한 설명과 작동 이유를 추가해 주시겠습니까? (코드 주석이 여기에서도 도움이 될 것입니다.)
  • 예, 성공적으로 사용하는 방법에 대한 예제를 추가 할 수도 있습니까?

답변

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

Adam

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" 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다