SQL Server 2008에서 쿼리 결과를 .csv 파일로 내보내기


141

SQL Server 2008에서 쿼리 결과를 .csv 파일로 내보내려면 어떻게해야합니까?



분리 문자가 필요합니까? 지금까지 대부분의 답변은 그렇지 않다고 가정하지만 실제로는 CSV가 아닙니다.
Nick

@Nick-일반적으로 구분 기호는 문자열로만 포함되며 일반적으로 따옴표로 묶습니다. 이것에 대한 해결책을 보려면 내 대답을 참조하십시오. stackoverflow.com/questions/6115054/…
MacGyver


때때로 파이썬을 사용합니다
LV98

답변:


168
  1. SQL Server Management Studio를 엽니 다.
  2. 도구> 옵션> 쿼리 결과> SQL Server> 텍스트 결과로 이동하십시오.
  3. 맨 오른쪽에는 출력 형식이라는 드롭 다운 상자가 있습니다.
  4. 쉼표로 구분을 선택하고 확인을 클릭하십시오.

아래는 해당 이미지의 전체 화면 버전입니다.

여기에 이미지 설명을 입력하십시오

쿼리 결과가 쉼표로 구분 된 텍스트로 표시됩니다.

쿼리 결과를 파일로 저장하려면 : Ctrl + Shift + F


10
대답은 약간 오해의 소지가 있습니다 ...를 누르면 Ctrl+Shift+F출력 모드 만 변경되며 이미 쿼리를 실행 한 경우 결과에 영향을 미치지 않습니다. 이를 반영하려면 쿼리를 다시 실행해야합니다. "결과를 파일로"모드에서 실행할 때 결과를 저장할 위치를 묻는 메시지가 나타납니다.
qJake

3
도구> 옵션> 쿼리 결과> SQL Server > 텍스트 결과 로 이동
congusbongus

45
쿼리를 다시 실행하는 것만으로는 충분하지 않았습니다. 쿼리 창을 닫고 새 창을 연 다음 쿼리를 다시 실행해야했습니다.
Breandán

3
@ Breandán 의견을 확인했습니다. 새 설정은 현재 열려있는 쿼리 창에 적용되지 않으므로 닫고 쿼리를 다시 실행해야합니다.
Shinigamae

3
내가해야 할 한 가지는 기본 RPT 확장으로 내보내는 것입니다. 그런 다음 간단히 이름을 CSV로 바꾸면 작동합니다.
Thomas Bennett

140

나는 이것이 조금 오래되었다는 것을 알고 있지만 여기 훨씬 쉬운 방법이 있습니다 ...

  1. 기본 설정으로 쿼리를 실행하십시오 (결과가 그리드 형식이 아닌 경우 그리드 형식으로 입력하십시오 (아래 참조)).

  2. 그리드 결과를 마우스 오른쪽 버튼으로 클릭하고 "결과를 다른 이름으로 저장"을 클릭하여 저장하십시오.

결과가 모눈 형식이 아닌 경우 쿼리를 작성하는 위치를 마우스 오른쪽 단추로 클릭하고 "결과"를 가리키고 "결과를 모눈"을 클릭하십시오.

열 머리글을 캡처하지 마십시오.

행운을 빕니다!


1
유일한 문제는이 방법으로 옵션을 설정할 수 없다는 것입니다. 예를 들어, 모든 NULL은 출력 파일에 "NULL"등으로 표시됩니다. 그러나 내가 모르는 것을 설정하는 방법이있을 수 있습니다.
노아

13
놀랍게도 SSMS 2012에서도 CSV 텍스트를 올바르게 인용하지 않습니다. CHAR / VARCHAR 내의 쉼표 또는 줄 바꿈은 인용해야하지만 그렇지 않습니다. 이로 인해 데이터가 새 열 또는 새 줄로 이동합니다.
Eric J.

4
또한 열 머리글을 제공하지 않습니다.
Don

8
@Don은 "쿼리"-> "쿼리 옵션 ...", 그리드 탭으로 가서 "결과를 복사하거나 저장할 때 열 헤더 포함"을 체크하면 열 헤더를 제공합니다.
Rob Wise

7
이것이 답이되어야합니다.
pspahn

46

PowerShell을 사용할 수 있습니다

$AttachmentPath = "CV File location"
$QueryFmt= "Query"

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath

감사합니다! 이것은 나를 위해 일한 유일한 제안이었습니다. 제대로 탈출 처리
emertechie

3
내가 할 수 있다면 +10 탈출을 처리하는 답변 만. 실행이를 얻으려면, 나는 스크립트의 상단에 두 줄을 추가했다 : Add-PSSnapin SqlServerCmdletSnapin100Add-PSSnapin SqlServerProviderSnapin100.
Eric J.

당신은 추가 시간 제한에 직면하는 경우 querytimeout을 예를 들어, 그래서Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
는 Tila

1
Powershell 초보자로서 SqlServer Module을 설치해야했습니다 Install-Module -Name SqlServer(그러나 Cmdlet에서 스냅 할 필요는 없습니다). 또한 명령을 스크립트에 저장했는데 실행 정책을 변경할 때까지 실행되지 않습니다 Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser.
sandyscott

@sandyscott 저는 Powershell 초보자이기도합니다. 감사합니다. 어쨌든 나는이 경우 RemoteSigned실행 정책으로 충분 하다고 생각 합니다.
BigBother

14

문제의 데이터베이스가 로컬 인 경우 다음은 쿼리 결과를 CSV 파일 로 내보내는 가장 강력한 방법 일 것입니다 (즉, 가장 많은 제어권을 제공함).

  1. 쿼리를 복사하십시오.
  2. 개체 탐색기에서 해당 데이터베이스를 마우스 오른쪽 단추로 클릭하십시오.
  3. "작업">> "데이터 내보내기 ..."를 선택하십시오.
  4. 데이터 소스를 구성하고 "다음"을 클릭하십시오.
  5. "플랫 파일"또는 "Microsoft Excel"을 대상으로 선택하십시오.
  6. 파일 경로를 지정하십시오.
  7. 플랫 파일로 작업하는 경우 원하는대로 구성하십시오. Microsoft Excel로 작업하는 경우 "Excel 2007"을 선택하십시오 (이전 버전의 행 수는 64k로 제한됨)
  8. "전송할 데이터를 지정하기 위해 쿼리 작성"을 선택하십시오.
  9. 1 단계의 쿼리를 붙여 넣습니다.
  10. 다음 >> 검토 맵핑 >> 다음 클릭 >> "즉시 실행"선택 >> "마침"을 두 번 클릭하십시오.

이 과정을 철저히 수행 한 후 다음 옵션이 최선의 방법이라는 것을 알았습니다.

PowerShell 스크립트

$dbname = "**YOUR_DB_NAME_WITHOUT_STARS**"
$AttachmentPath = "c:\\export.csv"
$QueryFmt= @"
**YOUR_QUERY_WITHOUT_STARS**
"@

Invoke-Sqlcmd   -ServerInstance **SERVER_NAME_WITHOUT_STARS** -Database  $dbname -Query $QueryFmt | Export-CSV $AttachmentPath -NoTypeInformation

관리자 권한으로 PowerShell 실행

& "c:\path_to_your_ps1_file.ps1"

1
당신은 추가 시간 제한에 직면하는 경우 querytimeout을 예를 들어, 그래서Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
는 Tila

6

MS Excel-> 데이터-> 새 쿼리-> 데이터베이스에서 .. 단계를 수행하십시오.


6

NS의 대답을 바탕으로 필드 주위에 따옴표와 쉼표로 구분 하여 CSV 파일로 내보내는 PowerShell 스크립트가 있으며 파일의 헤더 정보를 건너 뜁니다.

add-pssnapin sqlserverprovidersnapin100
add-pssnapin sqlservercmdletsnapin100

$qry = @"
Select
  *
From
 tablename
"@

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $qry | convertto-CSV -notype | select -skip 1  > "full path and filename.csv"

처음 두 줄은 Invoke-SqlCmd 명령 을 사용할 수있게합니다.


6

를 사용하여 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 파일의 첫 번째 줄이 모든 필드의 구분 된 목록인지 확인하십시오.


3

SSMS가 값을 큰 따옴표로 묶지 않기 때문에 값에 쉼표가 포함되어 있으면 기본 SQL Server Management Studio 기술을 사용하여 CSV로 내보내기 (@ 8kb 제안)가 작동하지 않습니다. 나를 위해 더 강력한 방법은 결과를 복사하고 (그리드 내부를 클릭 한 다음 CTRL-A, CTRL-C) 간단히 Excel에 붙여 넣는 것입니다. 그런 다음 Excel에서 CSV 파일로 저장하십시오.


2

QueryToDoc ( http://www.querytodoc.com )을 사용할 수 있습니다 . SQL 데이터베이스에 대해 쿼리를 작성하고 구분 기호를 선택한 후 결과를 Excel, Word, HTML 또는 CSV로 내보낼 수 있습니다.


2
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

@Slogmeister Extraordinaire Quoted가 정확합니다.

1> 열이 이미있는 파일 2> Office가 설치되어 있어야합니다.

직면 한 오류

1

메시지 7303, 수준 16, 상태 1, 줄 1 연결된 서버 "(null)"에 대한 OLE DB 공급자 "Microsoft.ACE.OLEDB.12.0"의 데이터 원본 개체를 초기화 할 수 없습니다. "

64 비트 http://download.microsoft.com/download/2/4/3/24375141-E08D-4803-AB0E-10F2E3A07AAA/AccessDatabaseEngine_x64.exe

32 비트 http://download.microsoft.com/download/f/d/8/fd8c20d8-e38a-48b6-8691-542403b91da1/AccessDatabaseEngine.exe

2

메시지 15281, 수준 16, 상태 1, 줄 1 SQL Server는이 구성 요소가이 서버에 대한 보안 구성의 일부로 해제되어 있으므로 구성 요소 'Ad Hoc Distributed Queries'의 STATEMENT 'OpenRowset / OpenDatasource'에 대한 액세스를 차단했습니다. 시스템 관리자는 sp_configure를 사용하여 'Ad Hoc Distributed Queries'를 사용할 수 있습니다. 'Ad Hoc Distributed Queries'사용에 대한 자세한 내용은 SQL Server 온라인 설명서에서 'Ad Hoc Distributed Queries'를 검색하십시오.

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO

2

Powershell을 사용하지 않으려는 경우이 답변은 8kb의 훌륭한 답변을 변형 한 것입니다. 유일한 차이점은 출력 형식으로 CSV를 선택하는 대신 탭 구분을 선택한다는 것입니다. 이렇게하면 데이터에 쉼표가 있으면 Excel의 셀을 건너 뛰지 않습니다. 또한 Excel의 기본 구분 기호를 탭으로 설정 한 경우 SSMS 쿼리 결과를 모두 복사 (CTRL-A, CTRL-C)하고 Excel에 붙여 넣기 (파일로 저장하거나 Excel로 가져올 필요가 없음) ) :

  • SSMS에서 도구> 옵션> 쿼리 결과> SQL Server> 텍스트 결과로 이동하십시오.
  • 맨 오른쪽의 출력 형식을 탭 구분 으로 변경
  • 확인을 클릭하십시오

이제 쿼리를 실행 한 다음 CTRL-A를 수행하여 모든 결과를 선택한 다음 CTRL-C를 사용하여 클립 보드에 복사 한 다음 Excel 2013으로 전환하고 (2007 년에도 작동 할 수도 있음) 붙여 넣기를 Excel의 기본값으로 가정 할 수 있습니다 구분 기호가 탭으로 설정되어 있습니다.

SSMS 쿼리 옵션 화면 이미지


-1

예, 서버에 직접 액세스 할 수 있으면이 모든 것이 가능합니다. 그러나 웹 / 응용 프로그램 서버에서만 서버에 액세스 할 수 있다면 어떨까요? 글쎄, 상황은 우리와 함께 오래 전부터 있었고 솔루션은 SQL Server Export to CSV 였습니다.


링크 ... 액세스가 거부 되었습니까?
hoggar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.