반응형


7강 대상 테이블 동적 설정

 

한대성 (admin@sqlleader.com)

에이디컨설팅 / 책임 컨설턴트

SQLLeader.com / 운영자

 

 

지금까지는 입력 데이터에 대해 WebLogData이라는 하나의 테이블에 로딩되도록 패키지를 구현하였습니다. 이번 강좌에서는 일자별로 대상 테이블을 달리하는 형태의 패키지를 구성해보도록 하겠습니다.

예를 들어 입력 데이터가 ex070217.log인 경우, 대상 테이블 역시 WebLogData_20070217, ex070218.log인 경우, WebLogData_20070217로 적재하도록 구현하는 것입니다.

 

패키지를 구성하기에 앞서 잠시 다음과 같은 일반적인 사항에 대해 잠시 언급하겠습니다. 매일 수행되는 작업을 구성하는 경우, DTS 패키지 또는 다른 ETL, 저장 프로시저 등에서 다음과 같은 형태의 쿼리를 자주 사용합니다.

 

SELECT Col1, Col2, Col3,, Coln

FROM Table

WHERE DateCol >= CONVERT(CHAR(10), GETDATE(), 121)

    AND DateCol <CONVERT(CHAR(10), GETDATE() + 1, 121)

GO

 

날짜 조회 방법은 이 외에도 다른 방법이 있겠지만, 그것보다 GETDATE() 또는 스크립트에서 DATE()를 쓰는 형태입니다.

 

위와 같은 형태로 작성된 패키지 또는 프로시저가 문제 없이 매일 매일 잘 수행되는 경우에는 아무런 문제가 없습니다. 하지만, 1 365일 단 한번도 문제없이 잘 수행되는 경우는 극히 드물 것입니다.

만약 이와 같은 형태로 패키지를 만들었는데, 당일 작업이 실패가 난 경우에는 그냥 수행하면 될 것입니다. 하지만, 며칠이 지난 후에 발견한 경우에는 상황이 많이 복잡해 질 수 있겠지요.

패키지 내에서 GETDATE() 부분을 찾아서 특정 날짜로 변경한 후에 수정해 줘야 할 것입니다. 패키지 내에 작업이 몇 개밖에 없다면 간단히 처리할 수 있겠지만 패키지 내에 수정해야 할 부분이 많거나 패키지의 수가 많다면 고된 작업일 것입니다.

 

간단한 사항 가지고 너무 길게 적은 것 같은데, 필자가 말하고자 하는 요지는

 

『날짜를 이용하는 데이터 처리 작업에서는 GETDATE() 대신에 변수를 이용하여 패키지를 구성하자는 것』

 

입니다.

위의 쿼리의 경우, GETDATE()를 직접 쓰는 대신 다음과 같이 설정합니다.

DECLARE @INPUTDATE DATETIME

SET @INPUTDATE = GETDATE()

 

SELECT Col1, Col2, Col3,, Coln

FROM Table

WHERE DateCol >= CONVERT(CHAR(10), @INPUDATE, 121)

    AND DateCol <CONVERT(CHAR(10), @INPUDATE + 1, 121)

GO

 

패키지에서도 이와 마찬가지로, 작업을 수행하는 날짜 변수를 정의하고 각 작업 개체들에서는 이 날짜 변수를 이용하도록 구성하는 것입니다.

 

 

 

5강에서 만든 패키지를 이용하여 계속 진행하겠습니다.

변수 창에서 날짜 값을 저장하는 변수를 하나 추가합니다.

 

 

ExecDate라는 String형 변수를 추가하고 값에는 20070217을 입력합니다.

 

변수 중, FileName이라는 변수를 선택한 후, 속성 창에서 Expression에 다음과 같이 설정합니다.

             "ex" + SUBSTRING(@[사용자::ExecDate], 3, 6) + ".log"

 

 

그런 다음, EvaluateAsExpression 옵션을 False에서 True로 설정합니다.

 

, 이제 ExecDate에 날짜 값이 설정되면 FileName이라는 변수에 해당 날짜의 파일명이 되도록 설정하였습니다.

 

이제, 제어 흐름의 대상 테이블 생성 작업을 더블 클릭한 후, 탭의 오른쪽 부분에 있는 Expressions를 선택한 후, ... 버튼을 클릭합니다.

속성 식 편집기에서 SqlStatementSource를 선택한 후, 다음과 같은 식을 입력합니다.

 

"IF EXISTS (SELECT * FROM sysobjects WHERE Type = 'U' AND Name = N'WebLogData_" + @[사용자::ExecDate] + "')

        DROP TABLE WebLogData_" + @[사용자::ExecDate] + "

GO

 

CREATE TABLE WebLogData_" + @[사용자::ExecDate] + "

(

        Seq int identity(1,1) NOT NULL,

        Date char(10) NOT NULL,

        Time char(8) NOT NULL,

        IP varchar(15) NOT NULL,

        URI_Stem varchar(255) NULL,

        Uri_Query varchar(255) NULL,

        Status smallint NULL,

        User_Agent varchar(200) NULL,

        CONSTRAINT PK__WebLogData_" + @[사용자::ExecDate] + " PRIMARY KEY(Seq)

)

GO"

 

 

이제 WebLog 데이터 로딩 작업을 더블 클릭하여 데이터 흐름 영역을 연 후, 여기에서도 변수를 하나 추가합니다.

변수의 이름은 TargetTable이며, String형으로 설정하고 값 부분에 WebLogData를 입력합니다.

 

 

TargetTable 변수를 선택한 상태에서 속성 창의 Expression에 다음과 같은 식을 입력합니다.

"WebLogData_" + @[사용자::ExecDate]

 

 

속성 중에서 EvaluateAsExpression 옵션을 True로 변경하지 않았습니다. 이 옵션은 아래의 OLE DB 대상에서 변수를 설정한 후에 변경할 것입니다.

 

이 변수는 데이터 흐름 작업의 WebLogTable 대상에서 사용할 것입니다.

 

OLE DB 대상에서 대상을 지정하는 방법은 다음과 같이 5 종류입니다.

 

 

5강까지는 직접 테이블을 지정하였기 때문에 테이블 또는 뷰 빠른 로드를 선택하였지만, 이제 매일 대상이 바뀌도록 설정해야 하기 때문에 달리 설정해야 합니다.

 

만약 WebLogTable 대상에서도 제어 흐름의 작업과 같이 Expressions가 있다면 직접 식을 입력해서 대상 테이블을 설정해도 되지만, 데이터 흐름 내의 작업 중 일부 개체 외에는 식을 이용하여 지정할 수는 없습니다.

 

데이터 액세스 모드를 테이블 이름 또는 뷰 이름 변수 빠른 로드로 설정한 후, 변수 이름에 『사용자::TargetTable』을 설정합니다.

 

 

※ 참고

만약 WebLogData 테이블이 없는 경우에는 이 단계에서 에러가 날 것입니다. 이 경우에는 1강의 테이블 생성 쿼리를 이용하여 WebLogData 테이블을 미리 만든 후에 다시 변수를 설정하시기 바랍니다.

 

여기까지 설정하고 확인을 눌러 OLE DB 대상 편집기를 닫은 후, 변수 창에서 TargetTable을 선택하고 속성 부분의 EvaluateAsExpression 옵션을 False에서 True로 변경합니다.

 

 

 

, 이제 패키지의 ExecDate 변수의 값을 변경하면서 작업을 실행하면 다음과 같이 일별 대상 테이블이 생성됩니다.

 

 

 

반응형

+ Recent posts