반응형

Object 변수를 이용한 루핑 작업 구현

 

 

한대성

MS SQL Server MVP

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

 

 

 

이전부터 글로 쓰고 싶었던 내용이 있었는데 차일피일 미루다가 같아서 오늘은 기필코 마음 먹고 글을 올리렵니다.

 

우선 소개할 예제는 이전에 설명한 적이 있는 내용입니다.

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

 

거의 동일한 형태이기에, 이미 알고 계신 분들은 그냥 복습 차원에서 참고하시기 바라며, 원래 예제를 준비한 것은 다음 강좌에서 설명할 RetainSameConnection 옵션에 따른 성능 차이를 보여주기 위해 준비한 것입니다.

 

 

 

다음과 같은 형태의 쿼리 유형을 SSIS 이용해서 만드는 간단한 예제입니다. SQL 쿼리 문은 예제로 설명하기 위해 효율성을 생각하지 않고 작성한 것입니다.

 

우선, 다음과 같이 SourceTable 만듭니다.

 

USE TEMPDB

GO

 

CREATE TABLE SourceTable

(

                  Seq INT IDENTITY,

                  Data1 VARCHAR(10) DEFAULT('AAA'),

                  Data2 INT DEFAULT(RAND()*100)

)

GO

 

SET NOCOUNT ON

GO

 

INSERT SourceTable DEFAULT VALUES

GO 1000

 

SET NOCOUNT OFF

GO

 

 

 

원본 테이블의 데이터를 옮겨 대상 테이블도 준비합니다.

 

USE TEMPDB

GO

 

 

CREATE TABLE TargetTable

(

                  Seq INT,

                  Data1 VARCHAR(10),

                  Data2 INT

)

GO

 

 

, 그럼 데이터를 옮기는 아주 무식한 형태의 쿼리를 하나 보겠습니다.

 

DECLARE @i as INT, @j as INT

DECLARE @tmpSeq INT, @tmpData1 VARCHAR(10), @tmpData2 INT

 

SELECT @i=min(Seq), @j=max(Seq) FROM SourceTable

 

WHILE (@i <= @j)

BEGIN

 

                  SELECT @tmpSeq = Seq, @tmpData1 = Data1, @tmpData2 = Data2

                  FROM SourceTable WHERE Seq = @i

 

                  INSERT TargetTable(Seq, Data1, Data2)

                  VALUES(@tmpSeq, @tmpData1, @tmpData2)

 

 

                  SET @i = @i + 1

END

GO

 

만약 실제 환경에서 동일 서버, 동일 DB 테이블을 위와 같이 옮겼다간 영원히 쿼리를 만질 없겠지요(ㅎㅎ) 앞서 말한 대로 루핑 예제로 구현하기 위해 무식하게 만든 쿼리입니다.

 

실무 환경에서 위와 같이 특정 데이터 집합으로 루핑 작업을 해야 때가 있습니다. , 이러한 형태를 가지고 SSIS 패키지로 만들어 봅시다.

 

 

패키지 파일을 만든 다음, 원본 테이블과 대상 테이블이 있는 데이터베이스에 대한 DB 연결을 추가합니다. 예제에서는 TEMPDB 하겠습니다.

 

 

원본 테이블의 데이터를 읽어와서 저장할 변수를 하나 추가합니다. 변수에는 데이터 전체가 저장될 변수이기에 Object형으로 설정합니다.

 

 

이제, SQL 실행 작업 추가하고선, 다음과 같이 원본 테이블에서 읽어올 쿼리를 작성합니다.

 

                  SELECT Seq, Data1, Data2 FROM SourceTable

 

그런 다음, 결과 집합(Result Set) 전체 결과 집합으로 설정합니다.

 

결과 집합 선택한 , 추가(A) 눌러 쿼리로부터 읽어온 데이터 집합을 저장할 변수를 설정합니다. , 지금 사용하는 연결이 OLE DB이며, 결과 유형이 전체 결과 집합이기 때문에 결과 이름 부분에는 0으로 입력해야 합니다.

 

 

, 여기까지가 SQL 쿼리로부터 데이터 집합을 SSIS Object 변수에 읽어오는 부분을 구현한 것입니다.

 

이렇게 읽어온 데이터를 루핑 처리 하기 위해서는 Foreach 루프 컨테이너 사용해야 합니다. 물론 스크립트 작업을 이용해서 이용할 수도 있지만, 여기서는 SSIS 개체를 이용하는 방식으로 설명 드리겠습니다.

 

도구 상자에서 Foreach 루프 컨테이너 추가한 , 앞서 만든 SQL 실행 작업 연결합니다.

 

Foreach 루프 컨테이너 더블 클릭해서 편집기를 , 컬렉션 탭에서 다음과 같이 설정합니다.

 

, SourceData라는 변수로부터 값을 차례차례 읽어오라는 설정입니다. 그럼 읽어온 값을 어딘가에 저장해야 하겠지요? 변수 매핑 탭에서 줍니다. 그런데, 저장할 변수를 만들지 않았습니다. 다시 확인을 눌러서 편집기를 닫고선 변수 창에서 추가하진 마시고, 아래와 같이 바로 < 변수…> 선택해서 값을 저장할 변수를 만들어 줘도 됩니다.

 

 

현재 SourceTable이라는 변수에는 다음과 같은 데이터가 저장되어 있습니다. , 앞에서부터 차례로 인덱스가 0, 1, 2 매겨집니다.

 

따라서, Seq, Data1, Data2라는 변수를 추가한 , 차례대로 인덱스 값을 0, 1, 2 설정해 줍니다.

 

변수

유형

기본값

Seq

Int32

0

Data1

String

 

Data2

Int32

0

 

 

 

확인을 눌러 편집기를 닫은 , 컨테이너 안에 SQL 실행 작업 하나 추가합니다. 작업은 대상 테이블에 데이터를 입력하는 명령을 수행합니다.

 

 

추가한 SQL 실행 작업을 더블 클릭해서 편집기를 , 다음과 같이 쿼리 문을 입력합니다.

 

                  INSERT TargetTable(Seq, Data1, Data2) VALUES(?, ?, ?)

 


쿼리
문에서 “?” 외부, SSIS에서 SQL 쿼리로 변수 값을 넘겨줄 사용하는 표시입니다.

 

이제 개의 “?” 입력할 변수를 지정해 줘야 합니다. 매개 변수 매핑 탭을 클릭한 , 다음과 같이 설정합니다.

 

매개 변수 이름 부분 역시, 현재 사용하고 있는 연결 유형이 OLE DB이기 때문에 차례대로 0, 1, 2 설정합니다.

 

. 되었습니다.

 

실행해 봅시다. 1000 수행되는 것이 보이시나요?

 

이와 같은 방식으로 SSIS에서 반복 실행 작업을 구현할 있습니다.

 

다음 강좌에서는 예제를 이용하여 성능에 대해 간단히 살펴보겠습니다.

 

 

반응형

+ Recent posts