연구개발/DTS & SSIS

유니코드 또는 비유니코드 문자열 데이터 형식으로 변환 오류

알 수 없는 사용자 2009. 6. 20. 20:15

() 유니코드 또는 비유니코드 문자열 데이터 형식으로 변환할 수 없습니다.

 

한대성

MS SQL Server MVP

에이디컨설팅 책임 컨설턴트 | SQLLeader.com 운영자

 

 

 

SSIS를 처음 사용하는 분들이 문의하시는 내용 중 가장 많은 경우가 바로 위와 같은 형태입니다.

예를 들어 nvarchar 형 데이터를 varchar 형 테이블에 넣거나 그와 반대인 경우이지요.

 

이런 문의를 받을 때면 항상 『열 유형과 열 길이를 꼭 맞추세요. SSIS에서는 반드시 일치 시켜야 합니다. 』 라고 답을 합니다.

 

주로 나오는 반응은

뭐가 이렇게 까다롭냐!” 또는 “SQL 2000 DTS에서는 잘 되더니만 왜 그런다냐.”

 

이에 대해 간단하고 명확한 예제 하나를 설명 드리겠습니다.

다음과 같은 두 테이블을 만듭니다.

 

CREATE TABLE AAA

(

                  COL NVARCHAR(10)

)

GO

 

CREATE TABLE BBB

(

                  COL VARCHAR(10)

)

GO

 

테이블 AAA는 유니코드 형(nvarchar) 열을 가진 테이블이고, 테이블 BBB는 비유니코드 형(varchar) 열을 가진 테이블입니다.

 

AAA 테이블에 다음과 같이 데이터를 입력합니다.

INSERT AAA VALUES ('가나다라마바사아자차')

GO

SELECT * FROM AAA

GO

/*

가나다라마바사아자차

*/

 

 

 

1) 쿼리 분석기에서 수행할 경우

INSERT BBB (COL)

SELECT COL FROM AAA

GO

/*

메시지 8152, 수준 16, 상태 2, 1

문자열이나 이진 데이터는 잘립니다.

문이 종료되었습니다.

*/

에러가 발생하긴 합니다. 하지만, 이 에러는 정확하게는 데이터가 잘리는 것에 대한 경고입니다. 만약 다음과 같이

             INSERT BBB (COL)

SELECT LEFT(COL, 5) FROM AAA

처럼 수행한다면 문제없이 성공합니다.

데이터 유형에 대해서는 암시적 변환(Implicit Conversion)이 이루어져 문제없이 처리되는 것입니다.

 

2) SQL 2000 DTS를 이용할 경우

 

잘 수행됩니다. 아니, 정확히는 잘 수행된 것처럼 보이지요.ㅎㅎ

하지만, 데이터는 잘못 들어갑니다.

SELECT * FROM BBB

GO

/*

가나다라마

*/

분명 10자리 데이터인데 잘라먹고(?) 5자리만 넣고선 성공했다라고 합니다.

실제로 저는 여러 번 이런 점 때문에 고생 했었습니다.(.)

 

 

3) SQL 2005 SSIS를 이용할 경우

데이터 유형을 맞추지 않는다면 시작도 못합니다. 따라서 데이터 변환이나 파생열 등을 이용해서 변경 작업을 해 줘야 합니다.

 

 

이 때 주의 사항~!!

한글은 유니코드형(NVARCHAR or NCHAR)에서는 1자리로 처리되지만, 비 유니코드형(VARCHAR or CHAR) 에서는 2자리로 처리됩니다. (영문이나 숫자는 1자리로 처리됨)

~~~! 데이터 변환 열의 길이를 두 배(20)로 늘려줘야 하며, 대상 테이블 열의 길이 또한 varchar(20)으로 늘려줘야 합니다.

 

             ALTER TABLE BBB

ALTER COLUMN COL VARCHAR(20)

 

    

 

 

글을 써 놓고 보니깐, SQL 2000 DTS만 죽일 놈(^^)이 된 것 같네요.(에공)

 

SSIS의 경우, 데이터 유형 및 길이, 코드(Locale)등까지 고려를 해야 한다는 점에서는 까다로운 놈임에는 틀림없습니다. 하지만, 그렇게 까다로운 점들이 실제 작업 환경에서 발생하는 이상 데이터 처리나 오류로 인한 문제들을 사전에 막기 위함이라 생각하면 어떨까 하네요.

(꼭 제가 SSIS 판매 사원 같네요.ㅎㅎ 아닙니다요~)

 

개발할 때는 번거롭고 고생스럽지만, 문제 없이 잘 돌아가는 것이 더 중요하겠지요^^

 

참고로, SSIS에서도 암시적 변환과 같은 형태로 처리하도록 설정할 수는 있습니다. (까다롭지만..)

다음 글을 참고하세요.

 

http://www.sqlleader.com/mboard.asp?exec=view&strBoardID=SS2005SSIS&intSeq=807