반응형
Foreach 루프 컨테이너를 이용한 패키지 반복 실행  

 

한대성

MS SQL Server MVP

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

 

 

 Question
 FLATFILE 하나당 패키지를 하나씩 만들고 별도의 패키지에서 '패키지 실행 작업' 연결을 통해 일괄처리하고자 합니다.
문제는 패키지명에 해당하는 테이블의 내용을 ETL 작업전에 DELETE 해주어야 하는데 단위 패키지마다 'SQL 실행작업' 으로 DELETE 를 해주는 방법외에 단위 패키지가 실행되기 전에 패키지명을 읽어서 해당테이블의 데이터를
DELETE 해줄 수 있는 방법이 있을까요.
 
 

 

다음과 같은 테스트 환경을 고려하겠습니다.

 

 

1.       TableA, TableB, TableC, … 라는 테이블에 데이터를 입력하는 개별 패키지를 TableA.dtsx, TableB.dtsx. TableC.dtsx, … 라고 만듭니다.

2.       테이블의 종류는 늘어날 있습니다.

3.       부모 패키지에서 패키지들을 호출하는데, 호출하기 전에 해당 테이블의 내용을 모두 지우는 작업을 구현합니다.

 

 

 

우선 TableA, TableB, TableC, … 라는 임시 테이블을 만듭니다.

USE TEMPDB

GO

 

CREATE TABLE TableA (Seq INT Identity, COL VARCHAR(10) DEFAULT('AAA'))

GO

CREATE TABLE TableB (Seq INT Identity, COL VARCHAR(10) DEFAULT('BBB'))

GO

CREATE TABLE TableC (Seq INT Identity, COL VARCHAR(10) DEFAULT('CCC'))

GO

 

테이블에 데이터를 입력하는 패키지들을 간단히 만듭니다.

 

예제에서는 다음과 같은 간단한 입력 쿼리를 실행하는 패키지로 설정하였습니다.

INSERT TableA DEFAULT VALUES

GO

INSERT TableA DEFAULT VALUES

GO

INSERT TableA DEFAULT VALUES

GO

INSERT TableA DEFAULT VALUES

GO

INSERT TableA DEFAULT VALUES

GO

 

이렇게 생성된 패키지를 D:\Packages\ 라는 디렉터리로 복사해 놓습니다.

 

이제 이를 실행할 패키지를 만듭니다.

패키지를 추가한 , 다음과 같은 변수들을 추가합니다.

 

 

PackageName 패키지 명을 저장하는 변수이며, 변수 중에서 이름 부분만을 잘라내어 TableName 이라는 변수에 저장할 것입니다. TableName 정의 부분은 뒤에서 구현하겠습니다.

PackagePath 패키지가 저장된 경로를 지정하는 변수입니다. 만약 패키지 경로가 변경될 경우, 변수 값만 변경해 주면 수행될 있도록 하기 위해 별도로 변수로 설정하였습니다.

 

이제, 지정된 위치의 모든 패키지 명을 읽어오는 작업을 설정합니다.

 

제어 흐름에 Foreach 루프 컨테이너 추가한 , 다음과 같이 설정합니다.

 

 

 

 

 

@[사용자::PackagePath]라는 변수에 저장된 경로에, *.dtsx 라는 파일 (이름만) 읽어온 , 이를 @[사용자::PackageName]이라는 변수에 반복적으로 저장하도록 설정하는 것입니다.

 

 

이제 PackageName이라는 변수로부터 TableName 읽어오도록 설정하겠습니다.

 

변수에서 TableName 선택한 , 오른쪽의 속성 창에서 Expression 부분을 선택합니다.

 

 

 

버튼을 클릭해서 작성기 다음, 다음과 같은 식을 입력합니다.

 

REPLACE(@[사용자::PackageName],".dtsx","")   

 

 

확인을 눌러 작성기 닫은 , EvaluateAsExpression 속성값을 True 변경해 줍니다.

 

 

  

연결 관리자에서 다음과 같이 OLE DB 연결 추가합니다. OLE DB 연결의 대상은 위에서 만든 테이블들이 있는 DB 설정합니다.

 

 

이제, Foreach 루프 컨테이너 내에 SQL 실행 작업 하나 추가한 , SQL 실행 작업 편집기에서 다음과 같이 Connection 부분만 지정합니다.

 

탭으로 이동한 , 다음과 같이 SqlStatementSource 속성을 선택한 , 오른쪽의 버튼을 클릭하여 작성기 엽니다.

 

 

이제 읽어온 테이블 이름을 이용해서 DELETE 명령을 수행하는 식을 만듭니다.

 

 

작성기와 SQL 작업 편집기를 닫은 , 패키지 실행 작업 추가하여 SQL 실행 작업 연결합니다.

 

연결 관리자에서 파일 연결을 선택한 , 사용 유형을 기존 파일로 선택하고 D:\Packages\ 디렉터리 내에 있는 임의의 패키지를 하나 선택합니다.

 

확인을 눌러 편집기를 닫은 , 해당 연결을 선택한 상태에서 속성 창의 Expression 다음과 같은 식을 설정합니다. ( 예제에서는 연결의 이름을 『패키지 파일』로 변경하였습니다.)

 

속성          : ConnectionString

              : @[사용자::PackagePath] + @[사용자::PackageName]

 

 

이제 패키지 실행 작업을 다음 아래와 같이 패키지 탭을 설정합니다.

 

, 모두 끝났습니다. 패키지를 수행해서 정상적으로 처리되는지 확인해 봅니다.

 

 

 

(1 수행 )

 

 

(2 수행 )

 
 
반응형

+ Recent posts