변경 데이터에 대한 쿼리 준비Prepare to Query for the Change Data

변경 데이터를 증분 로드하는 Integration ServicesIntegration Services 패키지의 제어 흐름에서 세 번째이자 마지막 태스크는 변경 데이터 쿼리를 준비하고 데이터 흐름 태스크를 추가하는 것입니다.In the control flow of an Integration ServicesIntegration Services package that performs an incremental load of change data, the third and final task is to prepare to query for the change data and add a Data Flow task.

참고

제어 흐름에 대한 두 번째 태스크는 선택한 간격에 대한 변경 데이터가 준비되었는지 확인하는 것입니다.The second task for the control flow is to ensure that the change data for the selected interval is ready. 이 태스크에 대한 자세한 내용은 변경 데이터의 준비 여부 확인을 참조하세요.For more information about this task, see Determine Whether the Change Data Is Ready. 제어 흐름 디자인의 전체 프로세스에 대한 설명은 데이터 캡처 변경(SSIS)을 참조하세요.For a description of the overall process of designing the control flow, see Change Data Capture (SSIS).

디자인 고려 사항Design Considerations

변경 데이터를 검색하려면 간격의 끝점을 입력 매개 변수로 받아 지정한 간격에 대한 변경 데이터를 반환하는 Transact-SQL 테이블 반환 함수를 호출합니다.To retrieve the change data, you will call a Transact-SQL table-valued function that accepts the endpoints of the interval as input parameters and returns change data for the specified interval. 데이터 흐름의 원본 구성 요소에서 이 함수를 호출합니다.A source component in the data flow calls this function. 이 원본 구성 요소에 대한 자세한 내용은 변경 데이터 검색 및 이해를 참조하세요.For information about this source component, see Retrieve and Understand the Change Data.

OLE DB 원본, ADO 원본 및 ADO NET 원본을 비롯하여 가장 자주 사용되는 Integration ServicesIntegration Services 원본 구성 요소는 테이블 반환 함수에 대한 매개 변수 정보를 파생시킬 수 없습니다.The most frequently used Integration ServicesIntegration Services source components, including the OLE DB source, the ADO source, and the ADO NET source, cannot derive parameter information for a table-valued function. 따라서 대부분의 원본은 매개 변수가 있는 함수를 직접 호출할 수 없습니다.Therefore, most sources cannot call a parameterized function directly.

함수에 입력 매개 변수를 전달하는 데에는 두 개의 디자인 옵션이 있습니다.You have two design options for passing the input parameters to the function:

  • 매개 변수가 있는 쿼리를 문자열로 조합.Assemble the parameterized query as a string. 스크립트 태스크나 SQL 실행 태스크를 사용하여 매개 변수 값이 문자열로 하드 코딩된 동적 SQL 문자열을 조합할 수 있습니다.You can use a Script task or an Execute SQL task to assemble a dynamic SQL string with parameter values hard-coded into the string. 그런 다음 이 문자열을 패키지 변수에 저장하고 이를 사용하여 원본 구성 요소의 SqlCommand 속성을 설정할 수 있습니다.Then, you can store this string in a package variable and use it to set the SqlCommand property of a source component. 원본 구성 요소에서 더 이상 매개 변수 정보를 필요로 하지 않기 때문에 이 방법이 성공합니다.This approach succeeds because the source component no longer requires parameter information.

    참고

    미리 컴파일된 스크립트는 SQL 실행 태스크보다 적은 오버헤드를 발생시킵니다.A precompiled script incurs less overhead than an Execute SQL task.

  • 매개 변수가 있는 래퍼 사용.Use a parameterized wrapper. 매개 변수가 있는 저장 프로시저를 매개 변수가 있는 테이블 반환 함수를 호출하는 래퍼로 만들 수도 있습니다.Alternatively, you can create a parameterized stored procedure as a wrapper that calls the parameterized table-valued function. 원본 구성 요소에서 저장 프로시저에 대한 매개 변수 정보를 파생시킬 수 있기 때문에 이 방법이 성공합니다.This approach succeeds because a source component can successfully derive parameter information for a stored procedure.

    이 항목에서는 첫 번째 디자인 옵션을 사용하여 매개 변수가 있는 쿼리를 문자열로 조합합니다.This topic uses the first design option and assembles a parameterized query as a string.

쿼리 준비Preparing the Query

입력 매개 변수의 값을 단일 쿼리 문자열로 연결하려면 먼저 쿼리에 필요한 패키지 변수를 설정해야 합니다.Before you can concatenate the values of the input parameters into a single query string, you have to set up the package variables that the query needs.

패키지 변수를 설정하려면To set up package variables

  • SQL Server Data Tools(SSDT)SQL Server Data Tools (SSDT)변수 창에서 SQL 실행 태스크에서 반환하는 쿼리 문자열을 보관할 string 데이터 형식의 변수를 만듭니다.In SQL Server Data Tools(SSDT)SQL Server Data Tools (SSDT), in the Variables window, create a variable with a string data type to hold the query string returned by the Execute SQL Task.

    이 예에서는 변수 이름으로 SqlDataQuery를 사용합니다.This example uses the variable name, SqlDataQuery.

    패키지 변수가 만들어지면 스크립트 태스크나 SQL 실행 태스크를 사용하여 입력 매개 변수의 값을 연결할 수 있습니다.With the package variable created, you can use either a Script task or Execute SQL task to concatenate the values of the input parameters. 다음 두 절차에서는 이러한 구성 요소를 구성하는 방법에 대해 설명합니다.The following two procedures describe how to configure these components.

스크립트 태스크를 사용하여 쿼리 문자열을 연결하려면To use a Script task to concatenate the query string

  1. 제어 흐름 탭에서 패키지의 For 루프 컨테이너 뒤에 스크립트 태스크를 추가하고 이 태스크에 For 루프 컨테이너를 연결합니다.On the Control Flow tab, add a Script task to the package after the For Loop container and connect the For Loop container to the task.

    참고

    이 절차에서는 패키지가 단일 테이블에서 증분 로드를 수행한다고 가정합니다.This procedure assumes that the package performs an incremental load from a single table. 패키지가 여러 테이블에서 로드하며 여러 자식 패키지가 있는 부모 패키지를 포함하는 경우 이 태스크는 각 자식 패키지에 첫 번째 구성 요소로 추가됩니다.If the package loads from multiple tables and has a parent package with multiple child packages, this task would be added as the first component to each child package. 자세한 내용은 여러 테이블의 증분 로드 수행을 참조하세요.For more information, see Perform an Incremental Load of Multiple Tables.

  2. 스크립트 태스크 편집기스크립트 페이지에서 다음 옵션을 선택합니다.In the Script Task Editor, on the Script page, select the following options:

    1. ReadOnlyVariables에 대해 목록에서 User::DataReady, User::ExtractStartTimeUser::ExtractEndTime 을 선택합니다.For ReadOnlyVariables, select User::DataReady, User::ExtractStartTime, and User::ExtractEndTime from the.

    2. ReadWriteVariables에 대해 목록에서 User::SqlDataQuery를 선택합니다.For ReadWriteVariables, select User::SqlDataQuery from the list.

  3. 스크립트 태스크 편집기스크립트 페이지에서 스크립트 편집 을 클릭하여 스크립트 개발 환경을 엽니다.In the Script Task Editor, on the Script page, click Edit Script to open the script development environment.

  4. Main 프로시저에 다음 코드 세그먼트 중 하나를 입력합니다.In the Main procedure, enter one of the following code segments:

    • C#에서 프로그래밍하는 경우 다음 코드 행을 입력합니다.If you are programming in C#, enter the following lines of code:

      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;  
      

      - 또는-- or -

    • Visual BasicVisual Basic에서 프로그래밍하는 경우 다음 코드 행을 입력합니다.If you are programming in Visual BasicVisual Basic, enter the following lines of code:

      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  
      
  5. 스크립트 실행에서 DtsExecResult.Success 를 반환하는 기본 코드 행을 그대로 둡니다.Leave the default line of code which returns DtsExecResult.Success from the execution of the script.

  6. 스크립트 개발 환경 및 스크립트 태스크 편집기를 닫습니다.Close the script development environment and the Script Task Editor.

SQL 실행 태스크를 사용하여 쿼리 문자열을 연결하려면To use an Execute SQL task to concatenate the query string

  1. 제어 흐름 탭에서 패키지의 For 루프 컨테이너 뒤에 SQL 실행 태스크를 추가하고 이 태스크에 For 루프 컨테이너를 연결합니다.On the Control Flow tab, add an Execute SQL task to the package after the For Loop container and connect the For Loop container to this task.

    참고

    이 절차에서는 패키지가 단일 테이블에서 증분 로드를 수행한다고 가정합니다.This procedure assumes that the package performs an incremental load from a single table. 패키지가 여러 테이블에서 로드하며 여러 자식 패키지가 있는 부모 패키지를 포함하는 경우 이 태스크는 각 자식 패키지에 첫 번째 구성 요소로 추가됩니다.If the package loads from multiple tables and has a parent package with multiple child packages, this task would be added as the first component to each child package. 자세한 내용은 여러 테이블의 증분 로드 수행을 참조하세요.For more information, see Perform an Incremental Load of Multiple Tables.

  2. SQL 실행 태스크 편집기일반 페이지에서 다음 옵션을 선택합니다.In the Execute SQL Task Editor, on the General page, select the following options:

    1. ResultSet단일 행을 선택합니다.For ResultSet, select Single row.

    2. 원본 데이터베이스에 대한 올바른 연결을 구성합니다.Configure a valid connection to the source database.

    3. SQLSourceType직접 입력을 선택합니다.For SQLSourceType, select Direct input.

    4. SQLStatement에 다음 SQL 문을 입력합니다.For SQLStatement, enter the following SQL statement:

      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 값을 전달하여 변경 데이터의 초기 로드에 대한 쿼리를 생성합니다.The else clause in this sample generates a query for the initial load of change data by passing a null value for the starting date and time. 이 샘플에서는 변경 데이터 캡처가 설정되기 전에 적용된 변경 내용도 데이터 웨어하우스에 업로드되어야 하는 시나리오를 다루지 않습니다.This sample does not address the scenario in which changes that were made before change data capture was enabled also have to be uploaded to the data warehouse.

  3. SQL 실행 태스크 편집기매개 변수 매핑페이지에서 다음 매핑을 수행합니다.On the Parameter Mapping page of the Execute SQL Task Editor, do the following mapping:

    1. DataReady 변수를 매개 변수 0에 매핑합니다.Map the DataReady variable to parameter 0.

    2. ExtractStartTime 변수를 매개 변수 1에 매핑합니다.Map the ExtractStartTime variable to parameter 1.

    3. ExtractEndTime 변수를 매개 변수 2에 매핑합니다.Map the ExtractEndTime variable to parameter 2.

  4. SQL 실행 태스크 편집기결과 집합페이지에서 결과 이름을 SqlDataQuery 변수에 매핑합니다.On the Result Set page of the Execute SQL Task Editor, map the Result Name to the SqlDataQuery variable.

    결과 이름은 반환된 단일 열의 이름인 SqlDataQuery입니다.The Result Name is the name of the single column that is returned, SqlDataQuery.

    이전 절차에서는 입력 매개 변수에 대한 하드 코딩된 문자열 값이 있는 쿼리 문자열을 준비하는 태스크를 구성합니다.The previous procedures configure a task that prepares a query string with hard-coded string values for the input parameters. 다음 코드는 이러한 쿼리 문자열의 예입니다.The following code is an example of such a query string:

    select * from CDCSample. uf_Customer('2007-06-11 14:21:58', '2007-06-12 14:21:58')

데이터 흐름 태스크 추가Adding a Data Flow Task

패키지의 제어 흐름을 디자인하는 마지막 단계는 데이터 흐름 태스크를 추가하는 것입니다.The last step in designing the control flow for the package is to add a Data Flow task.

데이터 흐름 태스크를 추가하고 제어 흐름을 완료하려면To add a Data Flow task and complete the control flow

  • 제어 흐름 탭에서 데이터 흐름 태스크를 추가하고 쿼리 문자열을 연결한 태스크를 연결합니다.On the Control Flow tab, add a Data Flow task and connect the task that concatenated the query string.

다음 단계Next Step

쿼리 문자열을 준비하고 데이터 흐름 태스크를 구성한 후 다음 단계는 데이터베이스에서 변경 데이터를 검색할 테이블 반환 함수를 만드는 것입니다.After you prepare the query string and configure the Data Flow task, the next step is create the table-valued function that will retrieve the change data from the database.

다음 항목: 변경 데이터 검색을 위한 함수 만들기Next topic: Create the Function to Retrieve the Change Data