반응형

요약 리포트 생성 발송 패키지 구현 – (3) 읽어오는 날짜 설정하기

 

한대성

MS SQL Server MVP

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

 

 

 

이번 강좌에서는 읽어오는 날짜를 자동으로 바꾸는 부분을 설정하겠습니다.

 

매일 수행되는 작업이라면 간단히 GETDATE()-1 읽어오는 날짜를 고정해 버릴 수도 있겠습니다.

 

DECLARE @ExecDate datetime

SET @ExecDate = CONVERT(CHAR(10), GETDATE()-1, 121)

 

EXEC dbo.USP_SelectData @ExecDate

 

하지만, 만약 특정 날짜에 대해 수행해야 경우도 있지 않을까요? , 1주일 전의 데이터를 잘못 계산했다라는 것을 알고 데이터를 수정해서 날짜의 것을 다시 뽑고 싶은 경우 입니다.

 

이러 저러한 것들을 고려해서 보면, ETL 패키지에서는 위에서와 같이 날짜를 고정해서 가져오는 형태로 만드는 것은 좋은 방법입니다.

 

그럼 어떤게 좋냐면? ( 생각입니다..^^)

입력 날짜 값이 없으면 그냥 날짜를 계산해서 수행하고, 만약 입력되는 날짜가 있으면 해당 날짜로 수행하는 형태로 만드는 것이지요.

 

 

시작합시다.

 

제어 흐름 영역의 곳을 선택한 , 다음과 같이 날짜를 입력 받는 변수와 수행할 날짜를 저장하는 변수 개를 만들고, 실행될 쿼리를 저장하는 변수(ExecQuery) 하나 추가합시다.

 

 

InputDate 변수는 외부에서 날짜를 입력할 사용될 변수이고, ExecDate 데이터를 추출하는 날짜가 저장될 변수입니다. 기본 값으로 아무 날짜나 넣어줍시다( 이요~!). 그리고, ExecQuery ExecDate 값을 이용해서 데이터 흐름에서 수행될 쿼리를 저장할 용도로 사용될 변수입니다.

 

이제 패키지의 가장 부분에 SQL 실행 작업 추가합니다. 작업의 이름도 날짜 설정으로 바꿉시다.

 

SQL 작업 편집기를 , 다음과 같이 쿼리를 입력하고 집합(ResultSet) 설정합니다.

 

SQLStatement에는 다음과 같은 쿼리를 입력합니다.

 

DECLARE @InputDate VARCHAR(30)

SET @InputDate = ?

 

IF @InputDate = '' OR @InputDate IS NULL

                  SELECT CONVERT(CHAR(10), GETDATE()-1, 121) AS ExecDate

ELSE

                  SELECT CONVERT(CHAR(10), CAST(@InputDate as datetime), 121) as ExecDate

 

 

매개 변수 매핑 탭에서는 다음과 같이 설정합니다. 쿼리의 ? 부분에 SSIS [사용자::InputDate] 변수를 대입시키도록 설정하는 것입니다.

 

결과 집합 탭으로 이동한 , 아래와 같이 설정합니다. 쿼리에서 출력되는 결과를 SSIS [사용자::ExecDate] 변수에 저장하도록 설정하는 것입니다.

 

, 그럼 이제 변수 창에서 ExecQuery 변수를 선택한 , 속성 창에 있는 Expressions 에서 다음과 같이 설정합니다.

 

부분에 다음과 같이 입력합니다.

"EXEC dbo.USP_SelectData @InputDate = '" +  @[사용자::ExecDate] + "'"

 

하나만 설정합시다. ExecQuery 속성 부분에서 EvaluateAsExpression 속성 값을 True 줍니다. 이에 대한 설명은 조금 뒤에서 하겠습니다.

 

, 데이터 흐름 작업을 다음, OLE DB 원본을 열고선 아래와 같이 변경합니다.

 


 

, ExecQuery 속성 EvaluateAsExpression 속성을 True 변경했는지 잠시 설명하겠습니다. 속성은 식으로 정의된 변수일 경우, 계산 값을 실행 단계가 아닌 디자인 단계에서도 계산하라는 속성입니다. (@.@) 간단히 예로 설명하자면, 전에 ExecQuery 대한 식을 정의했지만, 옵션이 False 경우에는, 패키지가 실행될 식이 계산되어 “EXEC dbo.USP_SelectData ‘2008-07-10’” 형태의 값이 대입됩니다. 실행되기 전에는 아무 값이 없는 것이지요. 그런데, OLE DB 원본에서는 변수에 저장될(!) 쿼리를 이용해서 원본을 구성해야 합니다. 그래서, 변수 속성에다가 디자인 단계에서부터 (=패키지를 실행하지 않은 상태이더라도) 식을 이용해서 값을 채워 넣어라~라고 설정하는 것입니다. 속성이 바로 EvaluateAsExpression입니다. ( 표현력의 한계를 느끼네요..흑흑~ 이해 안되시면 통과~!)

 

 

, 이제 패키지를 실행해 봅시다.

 

a. InputDate 변수 값에 아무 날짜를 입력하지 않고 돌린 경우

 

b. InputDate 변수 값에 2008-06-10 으로 입력하고 돌린 경우

 

(패키지 수행 후에는 InputDate 변수에 설정한 값을 지워주세요~!)

 

 

날짜에 따라 결과가 달리 출력되는게 보이시죠? 그런데, 특저 날짜를 돌리기 위해서 이와 같이 매번 패키지를 열어서 InputDate 날짜를 넣어주고 돌리도록 해야 할까요?

절대 아닙니다. 만약 패키지가 만들어진 상태에는 다음과 같이 패키지를 실행하는 명령 또는 SQL Agent 작업 단계 설정에서 InputDate 변수 값을 설정할 있습니다.

 

또는, 커멘드 명령 창에서 다음과 같이 변수 (InputDate) 설정할 수도 있습니다.

 

 

다음 강좌에서는 엑셀 파일을 일별로 만들어지도록 설정하는 작업을 구현해 보겠습니다.

 

그럼

 

@.@

 

반응형

+ Recent posts