한대성
에이디컨설팅 책임 컨설턴트| SQLLeader.com 운영자
박상우님께서 다음과 같은 질문을 하셔서 이와 관련된 숨은(^^) 꽁수 하나를 소개하고자 합니다. 이와 관련된 문제로 한동안 고민하다가 알게 된 방식입니다..
Question : 2005에서 유니코드(NVARCHAR)로 된 칼럼을 2000의 VARCHAR 칼럼으로 전송을 하려고 하는데 강좌에서처럼 "데이터변환" 이나 "파생 열"을 사용하지 않고 직접맵핑을 해 전송하려 했더니 오류가 발생하더라구요. 그 역으로 전송하려고 해도 마찬가지구요. "데이터변환" 이나 "파생 열"을 사용하면 되긴 하는데 번거로운 감이 있어서 혹시 묵시적으로 변환되어 전송될 수 있는 옵션은 없는지 궁금합니다. |
SQL 2000에서는 유니코드 데이터를 비유니코드 데이터로 변환하는 것이 매우 용이했습니다. 정확히 말해서, 별 신경을 쓰지 않았습니다. 암시적 변환(Implicit Conversion)이라고 해서 DTS에서 알아서 변형해서 처리를 해 주었기 때문이지요.
하지만 SSIS에서는 이러한 조건 규칙이 매우 엄격히 적용됩니다.
즉, varchar, char, text 형과 같은 비유니코드 데이터를 nvarchar, nchar, ntext 형의 유니코드 대상으로 바로 입력할 수도 없으며, 그 역의 경우도 마찬가지입니다.
예를 들어 다음과 같은 임시 테이블을 생성해 봅시다.
USE TEMPDB GO
CREATE TABLE NonUnicodeSource ( Seq INT IDENTITY, Col1 VARCHAR(20), Col2 CHAR(20) ) GO
CREATE TABLE UnicodeSource ( Seq INT IDENTITY, Col1 NVARCHAR(20), Col2 NCHAR(20) ) GO
INSERT NonUnicodeSource(Col1, Col2) VALUES ('테스트데이터', '테스트데이터') INSERT NonUnicodeSource(Col1, Col2) VALUES ('테스트데이터', '테스트데이터') INSERT NonUnicodeSource(Col1, Col2) VALUES ('테스트데이터', '테스트데이터') GO
INSERT UnicodeSource(Col1, Col2) VALUES (N'테스트데이터', N'테스트데이터') INSERT UnicodeSource(Col1, Col2) VALUES (N'테스트데이터', N'테스트데이터') INSERT UnicodeSource(Col1, Col2) VALUES (N'테스트데이터', N'테스트데이터') GO
CREATE TABLE NonUnicodeTarget ( Seq INT, Col1 VARCHAR(20), Col2 CHAR(20) ) GO
CREATE TABLE UnicodeTarget ( Seq INT, Col1 NVARCHAR(20), Col2 NCHAR(20) ) GO |
SSIS 패키지에서 데이터 흐름 작업을 추가한 후, tempdb를 가리키는 OLE DB 연결을 추가하고 OLE DB 원본과 OLE DB 대상을 추가합니다.
NonUnicodeSource è UnicodeTarget 으로 보내기
비유니코드형 데이터를 유니코드형 대상으로 바로 입력하는 경우 위와 같은 유효성 에러가 발생합니다. 일반적인 방법으로는 파생 열 변환 또는 데이터 변환 등을 이용하여 유형을 변경하는 작업을 수행해야 합니다.
하지만, 꼭 이렇게 파생 열 변환을 추가해서 변형해야 하는 것은 아닙니다.
다음 그림과 같이 Unicode Target을 선택한 후, 마우스 오른쪽 버튼을 클릭해서 나타나는 메뉴 중 고급 편집기 표시(A)를 선택합니다.
고급 UnicodeTarget 편집기에서 마지막에 있는 입/출력 속성 탭을 보면 외부 열과 입력 열이 있습니다.
입력 열은 데이터 변환으로부터 현재 작업 개체인 데이터 대상 개체로 입력되는 열 정보이며, 외부 열은 입력된 열 정보를 대상 개체에 저장하기 위해 출력하는 열 정보입니다. 입력 열의 정보는 수정을 할 수 없지만, 외부 열의 정보는 수정할 수 있습니다.
자 여기서 잠깐.. SSIS에서 형이 맞지 않다고 출력하는 부분은 바로 이 부분입니다. 입력 열 정보와 외부 열 정보의 차이로 인해 유효성 경고를 나타내는 것입니다.
그럼, 다음과 같은 외부 열의 정보를 입력 열과 같은 유형으로 변경해버리면 되겠네요.!!
<변경 전 외부 열 Col1 정보>
<변경 후 외부 열 Col1 정보>
Col2도 마찬가지로 변경한 후 확인해 봅시다.
그런데? 마찬가지로 유효성 경고가 납니다. 다시 고급 편집기에서 외부 열을 확인해 보면 Col1, Col2가 바꾼 유형이 아닌 원래 유형으로 되어 있는 것을 보실 수 있습니다.
아우띠..(좌절하지 마시고..^^)
SSIS의 숨겨진 기능 중의 하나가 또 소개됩니다. Unicode Target이라는 대상을 선택한 후 속성 창을 보면 ValidateExternalMetadata 라는 것이 있습니다. 정확한 용도는 더 있겠지만, 제가 파악한 바로는(^^) 외부의 메타 정보와 지정한 열 정보에 대해 검사를 하고 다른 경우에 외부 정보로 강제 변환하도록 하는 설정입니다.
복잡하면 그냥 넘어가시고, 이 값을 True에서 False로 변경하고 다시 Col1, Col2의 정보를 변경해 봅시다.
실행 시키면 됩니다. 데이터를 확인해봐도?
정상입니다.
왜 이런 것이 되냐하면^^
암시적 형 변환이 SQL Server 엔진에서 이루어진 것입니다. 즉, 데이터 대상 어댑터 역할을 하는 SSIS의 OLE DB 대상까지 강제로 형 변환을 해서 데이터를 넘긴 것이며, SQL 엔진의 암시적 형 변환 기능을 이용한 것입니다.
SQL 엔진에서는 암시적 형 변환이 가능합니다.
다음과 같은 쿼리를 참고하시기 바랍니다.
UnicodeSource è NonUnicodeTarget 으로 보내기
이것도 앞의 방식대로 수행하면 가능합니다.
엑셀 데이터 è NonUnicodeTarget 으로 보내기
엑셀 데이터도 Unicode이며 위와 같이 수행하면 변환 가능합니다.
정리하자면,
1. 데이터 대상에서 ValidateExternalMetadata 속성을 False로 변경한 후, 2. 고급 편집기의 입/출력 속성에서 외부 열 정보를 변경해주면 SSIS에서도 암시적 형 변환이 가능하다
입니다. |
'연구개발 > DTS & SSIS' 카테고리의 다른 글
Excel Data 로딩 시 Null로 처리되는 문제 (0) | 2011.08.27 |
---|---|
멀티 집계 변환 수행하기 (0) | 2011.08.27 |
정렬 변환을 이용한 중복 데이터 제거 방법 (0) | 2011.08.27 |
조회 변환에 Foreach 루프 컨테이너 설정하기 (0) | 2011.08.27 |
조회 변환을 이용한 데이터 처리 (0) | 2011.08.27 |