SQL Server Management Studio에서 "실제"CSV 형식으로 내보내기 출력을 얻는 방법은 무엇입니까?


80

SQL Server Management Studio에서 실행중인 쿼리가 있습니다 (SQL Server 2005 데이터베이스에 연결). 데이터를 CSV 형식으로 내보내고 싶습니다. 각 열 사이에 쉼표를 붙이는 CSV 형식이 아니라 문자열을 따옴표로 묶는 "실제"CSV 형식입니다. 이렇게하면 쉼표 나 따옴표가있는 데이터를 내보낼 수 있습니다.

내가 보는 모든 예는 워너비 형식으로 제한됩니다. 문자열 인용 옵션이 어디에 있는지 알 수 없습니다.

SSMS가이 기본적인 기능을 진정으로 수행 할 수 없다면 쉽게 수행 할 수있는 다른 도구가 있습니까? 데이터 덤프가 필요할 때마다 C # 프로그램을 작성하고 싶지 않습니다.


1
너무 짜증이 났기
Dan

3
어떻게 지구에이 ... 아직 해결되지 않은
레이 Miyasaka에게

답변:


124

SSMS 2012에는 도구-> 옵션-> 쿼리 결과-> SQL Server-> 그리드에 대한 결과에 ".csv 결과를 저장할 때 목록 구분 기호를 포함하는 인용 문자열"이라는 옵션이 있습니다. 그러한 옵션이 얼마나 오랫동안 존재했는지는 모르겠지만 두 가지에 당황합니다.

  1. 기본적으로 켜져 있지 않은 이유
  2. CSV 내보내기 코드의 본질적인 부분이 아닌 옵션 인 이유

제대로 가져올 수없는 CSV 내보내기가 기본 동작이라는 믿음을 무시할뿐입니다. Excel도 같은 작업을 수행하는 것으로 나타났습니다. 옵션이 있는지 확인해야합니다.

그동안 CSV 내보내기가 어떻게 완전히 쓸모 없는지에 대해 외 쳤을 때이 기괴한 기능을 알려준 동료 덕분에 이것이 내가 찾은 최고의 링크이므로 내가 넣을 것이라고 생각했습니다. 미래의 검색 자들을 위해 여기에있는 지식.

최신 정보

아래 스크린 샷 :여기에 이미지 설명 입력


4
SSMS 2008에도 존재합니다.
Lloyd

21
참고 : SSMS는 구분 기호 또는 한정자가 포함 된 필드를 한정하지만 줄 바꿈이 포함 된 필드는 한정하지 않습니다. 그래서이 점 SSMS에서 기술적으로 잘못된 CSV 파일을 생성
KyleMit

41
내가 가진 동일한 문제가있는 다른 사람 : 변경 사항을 적용하려면 새 쿼리 편집기 창을 열어야합니다. 이렇게 Save Results As..동작을 변경 한 후 내 보낸 CSV에 차이가 없습니다 전에 / 같은 결과 세트.
제이슨 Larke

7
SSMS v17에서 지정된 옵션이 누락되었음을 발견했지만 '결과를 복사하거나 저장할 때 열 머리글 포함'이라는 다른 옵션과 병합 된 것으로 보입니다. 설정을 적용하려면 새 쿼리 창을 열어야합니다.
Nine Tails

9
Microsoft : "CSV를 SSMS의 기본 내보내기 형식으로 만들어 보겠습니다." 또한 Microsoft : "기본 구현 세부 사항은 무시합시다."
Owen

12

내 일반적인 해결 방법은 쿼리에 빌드하는 것입니다.

SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...

이를 사용자 정의 함수로 빌드하여 좀 더 쉽게 만들 수 있지만 각 데이터 유형에 대해 별도의 함수를 빌드해야합니다.


2
필요하지 않을 수도 있지만 그냥하는 것이 더 쉽습니다 '"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'. 이렇게하면 필드 언더컷에 대해 걱정할 필요가 없습니다.
Rob

1
오늘은 varchar (max)를 사용합니다. 내가이 글을 처음 썼을 때, 나는 단지 (ugh) Sql Server 2000에만 있고 2005 년부터보기 시작하는 가게에서 왔었다.
Joel Coehoorn 16.

예를 들어 NVARCHAR원래 유형이 인 경우 열 유형을 보존해야 할 수도 있습니다 NVARCHAR.
NM

좋은 지적. varchar => nvarchar가 확장되고있어 문제가 발생하지 않지만 nvarchar => varchar가 데이터를 잃을 수 있습니다. 가장 잘 할 수있는 일이 원래의 열을 일치대로 사용하지만, 사람들은 복사 / 스택 오버플로 떨어져 예제 코드를 붙여 경향이 있기 때문에, 내 대답의 코드가 더 나은 NVARCHAR를 사용하는 아마 (그리고이 변화가 지금 만들어).
Joel Coehoorn

Microsoft는 csv 파일로 내보내는 것만 큼 기본적인 작업을 수행 할 수 없으므로 이것이 최상의 솔루션입니다. 줄 바꿈이있는 파일이 가장 많이 투표 된 솔루션을 사용하여 올바르게 내보내지지 않았습니다.
네 베스

8

이러한 설정의 다른 조합은 결과가 부정확하거나 부분적인 데이터를 가져올 수 있습니다. 이는 Microsoft가 이러한 문제를 해결하는 것이 중요하다고 생각하지 않았기 때문입니다. 결과를 파일로 보낼 때 CSV 파일에서 어떤 일이 발생하는지 설명하고 있습니다.

좋은 결과를 얻으려면 다음을 수행하십시오.

새 쿼리 창 열기 (새 탭 / 세션) ... 그렇지 않으면 아래 구성이 손실되고 기본값으로 다시 설정됩니다.

따옴표 안의 따옴표를 처리하는 쿼리를 작성하고 모든 문자열 데이터 유형을 따옴표로 묶습니다. 또한 다른 DBMS 및 프로그래밍 언어 문법은 이스케이프 된 큰 따옴표에 대해 다른 구문을 허용합니다 (이 출력을 다른 시스템에 대한 입력으로 사용하는 경우). 일부 사용 \". 일부 사용 "". XML은 ". 아마도 마이크로 소프트가이 기능을 무시하기로 선택한 이유 일 것입니다. 그래서 그들은 논쟁을 다룰 필요가 없었습니다.

.. 새 시스템의 이스케이프 시퀀스가 "".

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '""') + '"' FROM table1

.. 새 시스템의 이스케이프 시퀀스가 \".

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '\"') + '"' FROM table1

구성 :

쿼리 옵션> 결과> "결과를 복사하거나 저장할 때 열 머리글 포함"선택

쿼리 옵션> 결과> ".csv 결과를 저장할 때 목록 구분 기호가 포함 된 인용 문자열" -BROKEN; 사용하지 마세요!

쿼리 옵션> 결과> 기타 선택 취소

쿼리 옵션> 결과> 텍스트> 쉼표로 구분 (오른쪽 상단에 설정)

쿼리 옵션> 결과> 텍스트> "결과 집합에 열 머리글 포함"선택

쿼리 옵션> 결과> 텍스트> 기타 선택 취소

쿼리 옵션> 결과> 텍스트> "각 열에 표시되는 최대 문자 수"-문자열이 잘리지 않도록 최대 길이로 설정합니다.

Query> Results To File (3 가지 옵션 모두 전환)

쿼리 실행 (F5)

보고서의 파일 이름에 대한 프롬프트

결과를 보려면 파일을 엽니 다.

참고 :이 작업을 정기적으로 수행해야하는 경우 .NET 또는 Java 또는 익숙한 언어로이 작업을 수행하는 프로그램을 개발하는 것이 좋습니다. 그렇지 않으면 실수 할 가능성이 높습니다. 그런 다음 SQL Server에서 내보내기를 정의하기 전에 가져 오는 시스템의 구문을 잘 알고 있어야합니다.


7

혼란스러운 상태에서 옵션을 사용할 수 있지만 완벽하게 작동하지 않는 것은 슬픈 일입니다. 다음은 적어도 작동합니다.

  1. DB 컨텍스트 메뉴에서 "작업> 데이터 내보내기"를 선택합니다 (테이블 수준에서도 작동하지 않음).
  2. 소스에서 "SQL Server 용 Microsoft OLE DB 공급자"를 선택합니다.
  3. 대상으로 "Flat File ..."을 선택하고 "Format"을 구분 기호와 text qualifier큰 따옴표로 지정하십시오.
  4. 테이블 또는 쿼리 선택 (쿼리 작업)
  5. 마법사 완료

당신은 잘 가야합니다!


5
이것이 작동한다고 생각할 수 있지만 데이터에 큰 따옴표가 포함 된 열은 제대로 이스케이프되지 않습니다. Faux-csv는 내보내기 마법사의 모든 SQL Server 거래입니다.
mattmc3 2017-04-04

나 또는 내 소비자는 데이터의 텍스트 필드에 쉼표와 작은 따옴표가있는 경우 불만을 제기 할 이유가 없습니다. 이미 언급했듯이 쿼리 옵션을 사용하고 있었으며 더티 필드에 대해 알고 있다면 언제든지 quotename. 고맙게도 큰 따옴표를 사용하지 않았습니다. 그리고 외부 솔루션에 의존하는 대신 기본 옵션을 제안했습니다.
user1017815

이 옵션은 자동으로 큰 따옴표를 이스케이프하지 않더라도 여전히 가장 실용적입니다. replace ()를 사용하여 큰 따옴표를 이스케이프하는 것은 쉽습니다.
Brett Donald

4

PowerShell을 통해 SSMS에서 CSV로 내보내기에 대해 어떻게 생각 하십니까? 이 게시물은 현재 선택된 쿼리를 CSV로 내보내는 PowerShell 스크립트로 보내는 SSMS의 외부 도구를 정의하는 방법을 설명합니다.


지금까지 이것은 내 돈을위한 최고의 강타처럼 보입니다. SSMS의 외부 도구 메뉴에도 추가하지 않았습니다. 명령 줄에서 실행하고 있습니다.
Peter Recore

1

SSMS만으로는 이것을 할 방법이 없습니다. TOAD (http://www.toadworld.com/)에 CSV 옵션이 있다는 것을 알고 있습니다. 이스케이프 형식인지 확실하지 않습니다. SSIS가 옵션 인 경우 문자열 (true CSV)을 이스케이프하는 형식으로 변환 할 수 있지만 SSMS에는 없습니다.

C # 프로그램을 작성해야하는 경우 메타 데이터가 이스케이프가 필요한 부분을 파악할 수 있으므로 테이블을 쿼리 한 다음 쿼리를 실행하는 것이 좋습니다.


1

일반적으로 다음과 같은 기능을 사용합니다.

CREATE FUNCTION [dbo].[toExport]
(
    @txt varchar(max)

)
RETURNS varchar(max)
AS
BEGIN

    return REPLACE(REPLACE(REPLACE(@txt, ';', ','), CHAR(10), ' '), CHAR(13), ' ');

END

그리고 선택에서 여기에 넣습니다.

SELECT dbo.toExport( column_name ) AS column_name FROM ....

그리고 SMSS 2012에서는 그리드를 마우스 오른쪽 버튼으로 클릭하고 결과를 다른 이름으로 저장하거나 모든 그리드 (ctrl-A) 및 ctrl-V를 Excel로 복사합니다.

예를 들어 열 문제없이 MS Excel에서 데이터를 관리하는 가장 쉬운 방법입니다.

물론 도구-> 옵션-> 쿼리 결과-> SQL 서버-> 그리드에 결과에서 ".csv 결과를 저장할 때 목록 구분 기호를 포함하는 인용 문자열"을 클릭하고 필요한 경우 검색되는 최대 문자 수를 늘려야합니다.


1

응용 프로그램에서는 작동하지 않을 수도 있지만 일반적으로 탭으로 구분 된 형식으로 내 보내면이 문제를 해결할 수 있습니다. 이 간단한 솔루션이 적용되는 경우 간과하지 마십시오.


1

위에서 언급 한 모든 설정이 내 SSMS (SQL Server 2014)가 생성 한 CSV를 수정하지 않았기 때문에 탭으로 구분 된 파일을 내보내는 것이 더 나아지지 않았기 때문에 동료와 저는 SSMS를 변환하는 변환기 스크립트 (Ruby)를 만들었습니다. CSV를 읽을 수있는 CSV로. 원본 파일의 인코딩, 구분 기호 및 줄 바꿈을 유지하고 끝에서 정확한 바이트 일치 유효성 검사를 수행합니다 (파싱 된 (!) 입력 파일에서 SSMS 형식으로 파일을 만들고 두 파일을 비교합니다).

https://gist.github.com/gr8bit/62202ea89a7e3aff67df2ff080ee8e88

오류가 발생하면 github에서 저에게 연락하십시오. 건배!


나는 이것을 테스트해야하지만 이것은 우리가 필요로하는 것과 정확히 같고 이미 Ruby에 있습니다. 큰!
Ladislav Gallay

0

SSMS 내보내기를 사용하는 대신 Excel을 열고 SQL 연결에서 데이터를 가져 오는 것이 가장 쉬운 방법이라고 생각합니다. SSMS 2016을 사용하고 있으며 ".csv 결과를 저장할 때 목록 구분 기호를 포함하는 인용 문자열"옵션이 없습니다. 아마 작동하지 않기 때문에

Ron


0

2016 년부터는 쿼리 옵션에서 다음 옵션을 선택한 경우 이것이 기본 동작입니다.

여기에 이미지 설명 입력

열은 쉼표로 구분되고 쉼표가 포함 된 필드는 큰 따옴표로 캡슐화됩니다.


0

대안을 제시하고 싶습니다. 나는이 질문을 북마크에 추가했습니다. 많은 답변과 댓글에서 투표했습니다. 그러나 SQL Management Studio의 쿼리에서 CSV 파일을 내보내는 평범한 작업을 수행해야 할 때 항상 엉망입니다.

가장 쉬운 해결책은 다른 도구 인 무료 Dbeaver를 사용하는 것 입니다.

  1. Dbeaver 멀티 플랫폼 데이터베이스 도구를 다운로드합니다 (휴대용 버전이 있으며 컴퓨터에 관리자 권한이없는 경우 사용할 수 있습니다).
  2. 이를 실행하고 새 SQL Server 연결을 만듭니다.
  3. 새 "Sql 편집기"탭을 엽니 다.
  4. 쿼리를 실행하려면 화살표를 클릭하세요.
  5. 결과 그리드를 마우스 오른쪽 버튼으로 클릭하고 "데이터 내보내기"를 선택하고 CSV를 선택합니다.
  6. Voilá! 이제 적절한 형식의 CSV 파일이 있습니다.

미스터리가 없습니다. 다시 시작할 필요가 없습니다. 그냥 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.