로컬 임시 테이블의 활용 (2)

 

백도훈

에이디컨설팅 선임 컨설턴트

 

 

예제로 패키지를 하나 만들어보겠습니다.

 

제어 흐름에서 로컬 임시 테이블을 만듭니다.

à 데이터 흐름에서 로컬 임시 테이블에 데이터를 입력합니다.

à 제어 흐름에서 값을 확인해봅니다.

 

1.       DB 준비합니다.
로컬 임시 테이블에 데이터를 입력해도 세션에 독립적이기 때문에 값을 확인하기가 어렵습니다. 테스트를 위해 DB 생성하고 데이터 확인용 테이블을 생성하겠습니다.

CREATE DATABASE TargetDB

GO

USE TargetDB

GO

CREATE TABLE TB_T1 (COL1 INT, COL2 NVARCHAR(50))



2.       예제에서 사용할 DB 연결을 연결 관리자에 추가합니다.
AdventureWorks DB [Person].[Contact] 테이블의 데이터를 원본 소스로 사용할 생각입니다. 패키지를 추가하고 연결 관리자 영역에서 오른쪽 마우스 클릭을 해서 나오는 메뉴 OLE DB 연결을 선택해서 연결을 추가합니다. 연결할 DB AdventureWorks입니다.



추가된
연결의 이름을 SourceDB라고 변경하겠습니다.

연결 관리자에 OLE DB 연결을 추가하고 STEP 1. 에서 생성한 TargetDB 연결하겠습니다.



추가된
연결의 이름을 TargetDB라고 변경하겠습니다.




3.       SQL 실행 작업 태스크로 로컬 임시 테이블을 생성하겠습니다.
제어 흐름에 SQL 실행 작업 태스크를 추가합니다.
OLE DB
타입으로 TargetDB 연결하고 SQLStatement 속성에 다음 쿼리를 입력합니다.

CREATE TABLE #T1 (COL1 INT, COL2 NVARCHAR(50))

 




4.       로컬 임시 테이블에 입력할 데이터를 준비 하겠습니다.
데이터 흐름 작업 태스크를 추가하고 데이터 흐름 디자인 모드로 전환합니다. 데이터 흐름 영역에 OLE DB 원본을 추가하고 SourceDB 연결합니다.

중요한 것은 로컬 임시 테이블을 생성한 연결을 사용하면 된다는 것입니다. 반드시 다른 연결을 사용해야 합니다. 이번 예제에서 로컬 임시 테이블은 TargetDB에서 생성했고 지금 사용하는 연결은 SourceDB입니다.

테이블 또는 뷰에서 [Person].[Contact] 선택합니다.



페이지를 열고 ContactID, FirstName 열만 남기고 모두 체크를 해제합니다.




5.       로컬 임시 테이블에 데이터를 입력합니다.
OLE DB 대상을 추가하고 OLE DB 원본과 연결합니다.
편집기를 열고 연결 관리자 페이지에서 속성을 편집합니다.

OLE DB 연결 관리자

TargetDB

데이터 액세스 모드

테이블 또는 빠른 로드

테이블 또는 이름

[dbo].[TB_T1]




매핑 페이지를 열어서 입력 열과 대상 열을 바르게 연결 해줍니다.
ContactID – COL1, FirstName – COL2



그런데 이상한 부분이 있지 않습니까? 로컬 임시 테이블에 데이터를 입력한다고 하고서는 TB_T1 데이터를 입력하고 있습니다. 뭐지? -_-???

로컬 임시 테이블은 자신을 생성한 세션이 연결되어 있는 사이에 유지됩니다. 따라서 지금 패키지를 구성하는 동안에는 로컬 임시 테이블을 불러오는 것이 불가능합니다. 하지만 SSIS 메타 데이터의 검사를 위해서 어떤 대상을 지정해줘야만 합니다. 그래야 매핑도 가능하겠지요. 그래서 일단은 로컬 임시 테이블과 형태가 같은 TB_T1 테이블을 선택해서 SSIS에게 메타 데이터를 제공해주는 입니다.

그럼, 실제 로컬 임시 테이블은 어떻게 지정해주나요?
OLE DB
대상의 속성을 보겠습니다. OpenRowset 속성이 보이시나요? 앞선 편집기에서 드롭 다운 컨트롤에서 선택해서 지정한 테이블이 여기 있군요. 편집이 되나요? ~ 되네요. 로컬 임시 테이블 이름으로 살짝 변경해보겠습니다.
[dbo].[TB_T1]
à [dbo].[#T1]



간단하네~. 라고 생각한 순간 디자인 창을 보니 지정한 대상을 찾을 없다며 오류를 표시하고 있었습니다. 값을 변경한 사이 메타 데이터를 검사한 모양입니다.



다시 OLE DB 대상의 속성을 보겠습니다. ValidateExternalMetadata 라는 속성을 찾으셨나요? 값을 False 변경하겠습니다. 속성을 False 설정하는 것은 실행할 오류 나는 내가 보증하고 나더라도 내가 책임질 테니 실행 전에 컨트롤의 메타 데이터 검사는 하지 마라 의미가 되겠습니다.

 

 

6.       로컬 임시 테이블에 저장된 값을 확인하기 위해 확인 테이블에 로컬 임시 테이블의 값을 입력하겠습니다.
제어 흐름 디자인 모드로 돌아와서 SQL 실행 작업 태스크를 추가합니다.
OLE DB
타입으로 TargetDB 연결 시켜주고 SQLStatement 속성에 다음 쿼리를 입력합니다.

INSERT TB_T1 SELECT * FROM #T1

 





7.       거의 완성입니다. 디버그 해보겠습니다.



에러가 났습니다. 부분에 언급했던 연결 관리자의 속성 RetainSameConnection 값을 True 변경해주지 않았기 때문에 발생한 에러입니다. SQL 실행 작업 태스크 실행 DB 접속을 끊었기 때문에 뒤에서 임시 테이블을 사용할 없는 것입니다.
TargetDB
연결의 RetainSameConnection 속성을 True 변경하고 다시 실행해보겠습니다.





정상적으로 실행되었습니다. ^^=

+ Recent posts