변경 데이터에 대한 쿼리 준비
변경 데이터를 증분 로드하는 Integration Services 패키지의 제어 흐름에서 세 번째이자 마지막 태스크는 변경 데이터 쿼리를 준비하고 데이터 흐름 태스크를 추가하는 것입니다.
[!참고]
제어 흐름에 대한 두 번째 태스크는 선택한 간격에 대한 변경 데이터가 준비되었는지 확인하는 것입니다. 이 태스크에 대한 자세한 내용은 변경 데이터의 준비 여부 확인을 참조하십시오. 제어 흐름의 전체 디자인 프로세스에 대한 설명은 변경 데이터 캡처를 사용하여 증분 로드 개선을 참조하십시오.
패키지에서 변경 데이터 캡처를 사용하는 방법을 보여 주는 전체 종단 간 예제는 Codeplex에서 지정된 간격 동안 변경 데이터 캡처 패키지 예제 및 마지막 요청 이후 변경 데이터 캡처 패키지 예제를 참조하십시오.
디자인 고려 사항
변경 데이터를 검색하려면 간격의 끝점을 입력 매개 변수로 받아 지정한 간격에 대한 변경 데이터를 반환하는 Transact-SQL 테이블 반환 함수를 호출합니다. 데이터 흐름의 원본 구성 요소에서 이 함수를 호출합니다. 이 원본 구성 요소에 대한 자세한 내용은 변경 데이터 검색 및 이해를 참조하십시오.
OLE DB 원본, ADO 원본 및 ADO NET 원본을 비롯하여 가장 자주 사용되는 Integration Services 원본 구성 요소는 테이블 반환 함수에 대한 매개 변수 정보를 파생시킬 수 없습니다. 따라서 대부분의 원본은 매개 변수가 있는 함수를 직접 호출할 수 없습니다.
함수에 입력 매개 변수를 전달하는 데에는 두 개의 디자인 옵션이 있습니다.
매개 변수가 있는 쿼리를 문자열로 조합. 스크립트 태스크나 SQL 실행 태스크를 사용하여 매개 변수 값이 문자열로 하드 코딩된 동적 SQL 문자열을 조합할 수 있습니다. 그런 다음 이 문자열을 패키지 변수에 저장하고 이를 사용하여 원본 구성 요소의 SqlCommand 속성을 설정할 수 있습니다. 원본 구성 요소에서 더 이상 매개 변수 정보를 필요로 하지 않기 때문에 이 방법이 성공합니다.
[!참고]
미리 컴파일된 스크립트는 SQL 실행 태스크보다 적은 오버헤드를 발생시킵니다.
매개 변수가 있는 래퍼 사용. 매개 변수가 있는 저장 프로시저를 매개 변수가 있는 테이블 반환 함수를 호출하는 래퍼로 만들 수도 있습니다. 원본 구성 요소에서 저장 프로시저에 대한 매개 변수 정보를 파생시킬 수 있기 때문에 이 방법이 성공합니다.
이 항목에서는 첫 번째 디자인 옵션을 사용하여 매개 변수가 있는 쿼리를 문자열로 조합합니다.
쿼리 준비
입력 매개 변수의 값을 단일 쿼리 문자열로 연결하려면 먼저 쿼리에 필요한 패키지 변수를 설정해야 합니다.
패키지 변수를 설정하려면
Business Intelligence Development Studio의 변수 창에서 SQL 실행 태스크에서 반환하는 쿼리 문자열을 보관할 string 데이터 형식의 변수를 만듭니다.
이 예에서는 변수 이름으로 SqlDataQuery를 사용합니다.
패키지 변수가 만들어지면 스크립트 태스크나 SQL 실행 태스크를 사용하여 입력 매개 변수의 값을 연결할 수 있습니다. 다음 두 절차에서는 이러한 구성 요소를 구성하는 방법에 대해 설명합니다.
스크립트 태스크를 사용하여 쿼리 문자열을 연결하려면
제어 흐름 탭에서 패키지의 For 루프 컨테이너 뒤에 스크립트 태스크를 추가하고 이 태스크에 For 루프 컨테이너를 연결합니다.
[!참고]
이 절차에서는 패키지가 단일 테이블에서 증분 로드를 수행한다고 가정합니다. 패키지가 여러 테이블에서 로드하며 여러 자식 패키지가 있는 부모 패키지를 포함하는 경우 이 태스크는 각 자식 패키지에 첫 번째 구성 요소로 추가됩니다. 자세한 내용은 여러 테이블의 증분 로드 수행을 참조하십시오.
스크립트 태스크 편집기의 스크립트 페이지에서 다음 옵션을 선택합니다.
ReadOnlyVariables에 대해 목록에서 User::DataReady, User::ExtractStartTime 및 User::ExtractEndTime을 선택합니다.
ReadWriteVariables에 대해 목록에서 User::SqlDataQuery를 선택합니다.
스크립트 태스크 편집기의 스크립트 페이지에서 스크립트 편집을 클릭하여 스크립트 개발 환경을 엽니다.
Main 프로시저에 다음 코드 세그먼트 중 하나를 입력합니다.
C#에서 프로그래밍하는 경우 다음 코드 행을 입력합니다.
int dataReady; System.DateTime extractStartTime; System.DateTime extractEndTime; string sqlDataQuery; dataReady = (int)Dts.Variables["DataReady"].Value; extractStartTime = (System.DateTime)Dts.Variables["ExtractStartTime"].Value; extractEndTime = (System.DateTime)Dts.Variables["ExtractEndTime"].Value; if (dataReady == 2) { sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer('" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractStartTime) + "', '" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) + "')"; } else { sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer(null" + ", '" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) + "')"; } Dts.Variables("SqlDataQuery").Value = sqlDataQuery;
-또는-
Visual Basic에서 프로그래밍하는 경우 다음 코드 행을 입력합니다.
Dim dataReady As Integer Dim extractStartTime As Date Dim extractEndTime As Date Dim sqlDataQuery As String dataReady = CType(Dts.Variables("DataReady").Value, Integer) extractStartTime = CType(Dts.Variables("ExtractStartTime").Value, Date) extractEndTime = CType(Dts.Variables("ExtractEndTime").Value, Date) If dataReady = 2 Then sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer('" & _ String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractStartTime) & _ "', '" & _ String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) & _ "')" Else sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer(null" & _ ", '" & _ String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) & _ "')" End If Dts.Variables("SqlDataQuery").Value = sqlDataQuery
스크립트 실행에서 DtsExecResult.Success를 반환하는 기본 코드 행을 그대로 둡니다.
스크립트 개발 환경 및 스크립트 태스크 편집기를 닫습니다.
SQL 실행 태스크를 사용하여 쿼리 문자열을 연결하려면
제어 흐름 탭에서 패키지의 For 루프 컨테이너 뒤에 SQL 실행 태스크를 추가하고 이 태스크에 For 루프 컨테이너를 연결합니다.
[!참고]
이 절차에서는 패키지가 단일 테이블에서 증분 로드를 수행한다고 가정합니다. 패키지가 여러 테이블에서 로드하며 여러 자식 패키지가 있는 부모 패키지를 포함하는 경우 이 태스크는 각 자식 패키지에 첫 번째 구성 요소로 추가됩니다. 자세한 내용은 여러 테이블의 증분 로드 수행을 참조하십시오.
SQL 실행 태스크 편집기의 일반 페이지에서 다음 옵션을 선택합니다.
ResultSet에 단일 행을 선택합니다.
원본 데이터베이스에 대한 올바른 연결을 구성합니다.
SQLSourceType에 직접 입력을 선택합니다.
SQLStatement에 다음 SQL 문을 입력합니다.
declare @ExtractStartTime datetime, @ExtractEndTime datetime, @DataReady int select @DataReady = ?, @ExtractStartTime = ?, @ExtractEndTime = ? if @DataReady = 2 select N'select * from CDCSample.uf_Customer' + N'('''+ convert(nvarchar(30),@ExtractStartTime,120) + ''', ''' + convert(nvarchar(30),@ExtractEndTime,120) + ''') ' as SqlDataQuery else select N'select * from CDCSample.uf_Customer' + N'(null, ''' + convert(nvarchar(30),@ExtractEndTime,120) + ''') ' as SqlDataQuery
[!참고]
이 샘플의 else 절은 시작 날짜 및 시간에 대해 Null 값을 전달하여 변경 데이터의 초기 로드에 대한 쿼리를 생성합니다. 이 샘플에서는 변경 데이터 캡처가 설정되기 전에 적용된 변경 내용도 데이터 웨어하우스에 업로드되어야 하는 시나리오를 다루지 않습니다.
SQL 실행 태스크 편집기의 매개 변수 매핑 페이지에서 다음 매핑을 수행합니다.
DataReady 변수를 매개 변수 0에 매핑합니다.
ExtractStartTime 변수를 매개 변수 1에 매핑합니다.
ExtractEndTime 변수를 매개 변수 2에 매핑합니다.
SQL 실행 태스크 편집기의 결과 집합 페이지에서 결과 이름을 SqlDataQuery 변수에 매핑합니다.
결과 이름은 반환된 단일 열의 이름인 SqlDataQuery입니다.
이전 절차에서는 입력 매개 변수에 대한 하드 코딩된 문자열 값이 있는 쿼리 문자열을 준비하는 태스크를 구성합니다. 다음 코드는 이러한 쿼리 문자열의 예입니다.
select * from CDCSample. uf_Customer('2007-06-11 14:21:58', '2007-06-12 14:21:58')
데이터 흐름 태스크 추가
패키지의 제어 흐름을 디자인하는 마지막 단계는 데이터 흐름 태스크를 추가하는 것입니다.
데이터 흐름 태스크를 추가하고 제어 흐름을 완료하려면
- 제어 흐름 탭에서 데이터 흐름 태스크를 추가하고 쿼리 문자열을 연결한 태스크를 연결합니다.
다음 단계
쿼리 문자열을 준비하고 데이터 흐름 태스크를 구성한 후 다음 단계는 데이터베이스에서 변경 데이터를 검색할 테이블 반환 함수를 만드는 것입니다.
다음 항목:변경 데이터 검색을 위한 함수 작성
|