반응형

[DTS] 데이터 로딩 과정에서 필터링 하기

 

한대성

MS SQL Server MVP

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

 

 

 

Question
현재 CSV파일을 DTS를 이용해서 디비에 저장하고있는데요.
이 CSV파일이 몇만건 되다보니까 부담스러워서 CSV파일 속의 데이터에 조건을 걸어서 걸러내고 디비에 넣고 싶은데요.
엑셀 파일은 쿼리가 바로 먹혀서 셀렉트 문으로 걸러서 저장했는데 CSV는 바로 걸러내기가 불가능한가요? 디비에 저장하고 거기서 다시 걸러내는 방법 밖에는 없는지...

다음과 같은 예제 CSV 파일 , DataGroup 열의 값이 D 데이터만 테이블에 넣는 것을 SQL 2000 DTS 패키지로 구현하는 간단한 예를 설명 드리겠습니다.


 

전체 파일을 임시 테이블에 넣고선 DataGroup 열의 값을 비교해서 해당되는 데이터만 넣을 수도 있겠지만, 다음과 같이 넣는 과정에서 바로 필터링을 해서 넣을 수도 있습니다.

 

 

우선, 다음과 같이 CSV 파일에서 대상 테이블( 예제에서는 tempdb.dbo.Sample) 넣는 형태로 패키지를 구성합니다.


 

데이터 변환 작업(검은색 ) 더블 클릭해서 다음 원본, 대상, 변환 탭을 클릭해서 적절히 열을 매핑시킵니다. 이름을 이용해서 자동으로 매핑하게 됩니다.


 

변환 탭의 아래에 있는 모두 선택(S) 버튼을 클릭해서 들을 모두 선택한 , 모두 삭제(A) 선택해서 현재 자동으로 설정된 연결들을 제거합니다. 그런 다음, (모두 선택되어 있는 상태에서)중간에 있는 새로 만들기(W) 버튼을 클릭한 , 변환 만들기 창에서 ActiveX Script 선택합니다.


 

이어서 나타나는 변환 옵션 창에서 속성(P) 버튼을 클릭하면 자동으로 현재 변환에 대한 ActiveX Script 생성되며 스크립트를 이용할 있는 창이 나타납니다.

 

여기서 다음과 같이 스크립트를 변경합니다.

 

[기존]

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

'  Visual Basic Transformation Script

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

 

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

Function Main()

                  DTSDestination("Val") = DTSSource("Val")

                  DTSDestination("DataGroup") = DTSSource("DataGroup")

                  DTSDestination("Seq") = DTSSource("Seq")

                  Main = DTSTransformStat_OK

End Function

 

[변경]

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

'  Visual Basic Transformation Script

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

 

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

Function Main()

 

                 

                  DTSDestination("Val") = DTSSource("Val")

                  IF DTSSource("DataGroup") = "D" THEN

                                   DTSDestination("DataGroup") = DTSSource("DataGroup")

                  ELSE

                                   Main = DTSTransformStat_SkipRow

                                   Exit Function

                  END IF

 

                  DTSDestination("Seq") = DTSSource("Seq")

                  Main = DTSTransformStat_OK

End Function

 

 

이와 같이 변경한 , 스크립트 편집 창을 닫으면 다음과 같이 변환의 모양이 바뀝니다.


 

, 테스트 봅시다.


 

전체 데이터인 10000 건이 옮겨진 것처럼 보입니다. 하지만 실제 대상 테이블에는 아래와 같이 DataGroup “D” 데이터만 들어가 있습니다.


 


이와 같은 방식으로 DTS에서도 임시 테이블을 사용하지 않고 읽어오는 과정에서 대상을 필터링 또는 변환할 있습니다. 참고로, 이와 같은 부분이 바로 SQL 2005 SSIS 데이터 흐름 작업 부분입니다.


GreatHuman 정말 감사합니다 많은 도움이되었습니다. 엑티브x 스크립트를 이용하는 방법으로 가능하군요~^^ 2008/02/18

GreatHuman //**********************************************************************
// Java Transformation Script
//************************************************************************

// 각 원본 열을 대상 열로 복사합니다.
function Main()
{
if DTSSource("JobCode1") = "160" then
DTSDestination("jobcode1") = DTSSource("JobCode1");
else
Main = DTSTransformStat_SkipRow
Exit Function
end if
DTSDestination("id_num") = DTSSource("AdId");
return(DTSTransformStat_OK);
}
이렇게 if문을 넣고 실행하면
7번째 줄에 ')' 가 필요하다는 오류가 생기는데요 sql2000을 쓰고있는데 if문을 빼면 실행되고 넣으면 오류가 생기네요..
오류 해결 방안이 없을까요..??
2008/02/18

GreatHuman 위에 ')' 가 아니라 '(' 네요.. 2008/02/18

한대성 위의 글 부분에서의 스크립트를 JScript로 구현한다면 다음과 같습니다.

//**********************************************************************
// Java Transformation Script
//************************************************************************

// 각 원본 열을 대상 열로 복사합니다.
function Main()
{
if (DTSSource("DataGroup") == "D")
DTSDestination("DataGroup") = DTSSource("DataGroup");
else
{
return(DTSTransformStat_SkipRow);
exit(-1);
}

DTSDestination("Val") = DTSSource("Val");
DTSDestination("Seq") = DTSSource("Seq");
return(DTSTransformStat_OK);
}
2008/02/18

GreatHuman 감사합니다^^ 2008/02/18

반응형

+ Recent posts