요약 리포트 생성 및 발송 패키지 구현 – (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)을 설정할 수도 있습니다.
다음 강좌에서는 엑셀 파일을 일별로 만들어지도록 설정하는 작업을 구현해 보겠습니다.
그럼
@.@
'연구개발 > DTS & SSIS' 카테고리의 다른 글
SSIS를 이용한 서버 성능 수집 프로세스 구현 - 소개와 구조 설명 (0) | 2009.06.20 |
---|---|
요약 리포트 생성 및 발송 패키지 구현 – (4) 결과 파일 발송 (0) | 2009.06.20 |
요약 리포트 생성 및 발송 패키지 구현 – (2) 엑셀에 출력하기 (0) | 2009.06.20 |
요약 리포트 생성 및 발송 패키지 구현 – (1) 강좌 소개 및 준비 (0) | 2009.06.20 |
DB 데이터를 엑셀 시트에 분할하여 내보내기 (3) (0) | 2009.06.20 |