반응형

[DTS]스크립트를 이용한 데이터 변환 작업

 

한대성

MS SQL Server MVP

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

 

 

 

SQL 2000 DTS데이터 변환 작업에서 스크립트를 이용한 처리 작업에 대해 간단히 설명하겠습니다.

 

SQL 2000데이터 가져오기/내보내기 마법사를 이용해서 테이블 간, 다른 이기종 DBMS간 데이터를 옮기는 작업에서 자주 사용하는 작업 형태가 데이터 변환 작업입니다.

 

다음과 같은 원본 테이블과 대상 테이블을 예로 설명하겠습니다.

--원본 테이블

CREATE TABLE SourceTable

(

        SEQ INT IDENTITY,

        DateCol char(20) NULL

)

GO

 

INSERT SourceTable VALUES ('2007-05-14')

INSERT SourceTable VALUES ('2007-05-15')

INSERT SourceTable VALUES (NULL)

INSERT SourceTable VALUES ('2007-05-17')

INSERT SourceTable VALUES ('2007051890')

INSERT SourceTable VALUES ('abcde')

INSERT SourceTable VALUES ('2007/05/20')

GO

 

--대상 테이블

CREATE TABLE TargetTable

(

       SEQ INT,

       DateCol datetime null

)

GO

 

SourceTable DateCol이라는 문자형 열에는 날짜 데이터들이 들어있지만, Null 또는 ‘abcde’와 같이 날짜 데이터가 아닌 값이 들어있을 수도 있습니다. 또한 날짜 형식이 ‘2007-05-14’와 같은 형식뿐만 아니라 ‘2007/05/20’과 같이 여러 형태로 되어 있는 경우도 있습니다. 이러한 데이터를 TargetTable DateCol이라는 날짜형 열에 입력할 것입니다.

 

단순히 SourceTable의 열을 TargeTable로 매핑하도록 구성한 후 패키지를 실행시키면 다음과 같은 에러가 발생합니다.

 

 

 

이러한 경우에 스크립트를 이용하여 간단히 처리할 수 있습니다.

 

위의 그림에서와 같이 변환 탭에서 우선 모두 삭제(A)를 클릭해서 자동으로 이름으로 매핑된 연결선을 제거합니다. 그런 다음, 모두 선택(S)을 클릭해서 원본 열과 대상 열이 모두 선택되도록 합니다.

 

 

중간에 있는 새로 만들기(W)를 클릭한 후, ActiveX Script를 선택합니다.

 

 

변환 옵션 창에서 속성(P)를 클릭하여 스크립트 변환 속성 편집기를 엽니다.

언어(L) 부분에서 VB Script Language로 선택되어 있는지를 확인합니다. 만약 다른 것으로 선택되어 있는 경우, VB Script Language로 변경한 후, 아래에 있는 자동 생성(A)를 클릭하면 기본적인 스크립트가 생성됩니다.

 

 

, 이제 스크립트를 잠시 살펴봅시다.

DTSDestination("DateCol") = DTSSource("DateCol")

DTSSource는 원본이며, DTSDestination은 대상입니다. , 원본 중 DateCol이라는 열의 데이터를 대상의 DateCol이라는 곳으로 넣는다는 아주 간단하고 단순한 대입식입니다.

 

이 식을 다음과 같이 약간 변형해 봅시다.

'**********************************************************************

'  Visual Basic Transformation Script

'************************************************************************

 

'  원본 열을 대상 열로 복사합니다.

Function Main()

        IF IsDate(DTSSource("DateCol")) = true THEN

               DTSDestination("DateCol") = DTSSource("DateCol")

        ELSE

               DTSDestination("DateCol") = Null

        END IF

 

        DTSDestination("SEQ") = DTSSource("SEQ")

        Main = DTSTransformStat_OK

End Function

 

죽 원본 DateCol열이 날짜 형식의 데이터이면 그대로 넣고, 그렇지 않은 경우이면(=날짜 형식의 데이터가 아니면) Null을 입력하도록 하였습니다.

 

이렇게 설정하고선 편집기를 닫으면 다음과 같은 모양으로 연결됩니다.

 

 

확인을 누른 후, 패키지를 실행하면 이전과는 달리 정상적으로 수행됩니다.

 

 

TargetData의 테이블도 다음과 같이 날짜 형식의 데이터인 경우에만 정상적으로 입력되었으며 날짜 형식의 데이터가 아닌 경우에는 Null이 입력되었습니다.

 

 

만약 DateCol의 데이터가 정상적인 날짜 형태의 데이터가 아닌 경우에 해당 행을 입력하지 않고 넘어가도록 하려면 다음과 같이 스크립트를 설정하면 됩니다.

'**********************************************************************

'  Visual Basic Transformation Script

'************************************************************************

 

'  원본 열을 대상 열로 복사합니다.

Function Main()

        IF IsDate(DTSSource("DateCol")) = true THEN

               DTSDestination("DateCol") = DTSSource("DateCol")

        ELSE

               Main = DTSTransformStat_SkipRowInfo

               Exit Function

        END IF

 

        DTSDestination("SEQ") = DTSSource("SEQ")

        Main = DTSTransformStat_OK

End Function

이 경우의 출력 결과는 다음과 같습니다.

 

 

이와 같이 스크립트를 이용하여 다양한 변환이나 연산을 수행하도록 구성할 수 있습니다.

 

  

본 게시판에 실린 글은 누구나 복사하셔서 이용하셔도 되지만, 반드시 출처(SQLLeader.com) 링크를 밝혀주셔야 합니다.

 

반응형

+ Recent posts