본문 바로가기
DB/RDBMS

[MSSQL] CSV 파일 생성 및 문제 해결 방법

by 소라둥이 2020. 4. 27.

MSSQL에서 CSV 파일 생성 방법은 크게 3가지가 있다.

 

1. SSMS, 즉 툴을 이용하여 생성

 

2. Bulk문 사용

 

3. bcp cmdshell 사용

 

 

1번은 수 많은 작업이 주기적으로 필요 할 시 일일이 사람이 클릭해서 만들어야되므로 매우 번거롭다.

하지만 간단한 테스트로는 사용하기 가장 편하다.

 

2번은 로컬환경에서만 가능하다.

대부분 토이 프로젝트나 연습용이 아니라면 DB서버는 별개로 있을 것이다. 따라서 사용하기 힘들다.

 

3번은 다른 서버도 접근이 가능하지만 권한이 필요하다.

권한만 있다면 CSV파일 생성 뿐만 아니라 수많은 작업이 가능하기에 매우매우 조심해야된다.

 

bcp의 여러 기능 중 CSV 파일 생성 방법이다.

 

EXEC master..xp_cmdshell 'bcp "[select문]" queryout "[파일저장경로]" -c -U [유저아이디] -P [비밀번호]

 

위 구문은 가장 최소한의 옵션으로 생성한 CSV 파일이다.

select문에 의해 조회된 데이터가 지정한 경로에 저장된다.

여기서 -c는 데이터를 문자형태로 저장하겠다는 옵션이다. 사실상 필수 옵션이다.

 

이걸로만 모든 작업이 문제없이 해결되면 좋겠지만 역시나 여러 문제가 발생한다.

 

 

1. 한글 깨짐

한글은 정말 한번이라도 안깨진 적이 없는 것 같다.

여기서 한글이 깨지는 이유는 xp_cmdshell에 있다.

xp_cmdshell은 말DB서버의 cmd창을 우리가 원격으로 사용하는 것이다.

cmd를 쓰다가 한글깨짐 문제를 겪어본 사람들이 많을텐데 역시나 DB서버의 cmd도 예외는 아니다.

따라서 해당 cmd의 인코딩을 변경하는 옵션을 부여해야된다.

 

-C 65001

 

65001이 익숙하신 분은 cmd에서 utf-8 문제를 겪어보신 분들일 것이다.

65001이 UTF-8을 의미하며 -C가 인코딩 방식 옵션이다.

bcp문의 옵션은 순서와 상관 없으며 위 구문에 아무곳에나 붙여주면 되지만 주로 유저정보를 가장 마지막에 쓴다.

 

 

2. 파일 저장 위치

CSV파일을 저장했는데 문제는 DB서버에 저장된다.

만약 내 서버나 다른 서버로 저장하고 싶다면 역시 옵션을 부여하면된다.

 

-S [ip 주소]

 

혹시나 bcp 자체가 실행이 안된다면 -S (local)을 주면 된다.

 

 

3. 구분자 문제

CSV파일을 저장할 때 bcp의 queryout의 구분자는 기본 값이 \t 즉 탭이다.

여러가지 이유로 다른 구분자를 사용하고 싶다면

 

-t "[구분자]"

 

를 사용하면 된다.

 

 

마지막으로 CSV 파일 형식이다.

기본적으로 CSV파일은 엑셀에서 볼 수 있다.

하지만 굳이 엑셀로 볼 필요가 없다면 txt파일로 생성해도 무관하다.

파일 경로 작성 시 확장자를 txt로 작성하면 된다.

txt와 csv 어느것이 더 빠른지 테스트는 해보지 않았지만

아무 기능 없는 txt가 더 빠르지 않을까 싶어서 사용하게 되었다.

시간 날때 한번 테스트 해봐야겠다.

 

-찾아본 바로는 성능차이는 없다고 하니 아무거나 하면 될 것 같다.