Preparando para consultar pelos dados de alteração

No fluxo de controle de um pacote Integration Services que realiza uma carga incremental de dados de alteração, a terceira e última tarefa serve com preparo para consultar as alterações dos dados e adicionar uma tarefa de fluxo de dados.

ObservaçãoObservação

A segunda tarefa para o fluxo de controle garante que os dados de alteração para o intervalo selecionado estarão prontos. Para obter mais informações sobre essa tarefa, consulte Determinando se os dados de alteração estão prontos. Para obter uma descrição do processo geral de criação do fluxo de controle, consulte Melhorando cargas incrementais com Change Data Capture.

Para ver exemplos completos que demonstram o uso do Change Data Capture em pacotes, consulte os exemplos do Integration Services no Codeplex.

Considerações de criação

Para recuperar os dados de alteração, você chamará uma função com valor de tabela de Transact-SQL que aceita os pontos de extremidade do intervalo como parâmetros de entrada e retorna dados de alteração para o intervalo especificado. Um componente de origem no fluxo de dados chama esta função. Para obter mais informações sobre esse componente de origem, consulte Recuperando e compreendendo os dados de alteração.

Os componentes de fonte do Integration Services usados com mais frequência, incluindo a fonte OLE DB, a fonte ADO e a fonte ADO .NET, não podem derivar informações de parâmetros para uma função com valor de tabela. Entretanto, a maioria das fontes não pode chamar uma função parametrizada diretamente.

Você tem duas opções de design para passar os parâmetros de entrada à função:

  • Montar a consulta parametrizada como uma cadeia de caracteres. É possível usar uma tarefa Script ou uma tarefa Executar SQL para montar uma cadeia de caracteres de SQL dinâmica com valores de parâmetro codificados na cadeia de caracteres. Em seguida, essa cadeia de caracteres poderá ser armazenada em uma variável do pacote e usada para definir a propriedade SqlCommand de um componente de origem. Este procedimento é bem-sucedido porque o componente de origem não exige mais as informações do parâmetro.

    ObservaçãoObservação

    Um script pré-compilado causa menos sobrecarga do que uma tarefa Executar SQL.

  • Usar um wrapper parametrizado. Se desejar, você poderá criar um procedimento armazenado parametrizado como um wrapper que chama a função com valor de tabela parametrizada. Este procedimento é bem-sucedido porque o componente de origem pode derivar com êxito as informações de parâmetro para um procedimento armazenado.

Este tópico usa a primeira opção de design e monta uma consulta parametrizada como uma cadeia de caracteres.

Preparando a Consulta

Antes de concatenar os valores dos parâmetros de entrada em uma cadeia de caracteres simples, é preciso configurar as variáveis do pacote que a consulta precisa.

Para definir as variáveis do pacote

  • No Business Intelligence Development Studio, na janela Variáveis, crie uma variável com um tipo de dados de cadeia de caracteres para manter a cadeia de caracteres de consulta que retorna da tarefa Executar SQL.

    Este exemplo usa o nome da variável, SqlDataQuery.

Com a variável de pacote criada, você pode usar tanto uma tarefa Script quanto uma tarefa Executar SQL para concatenar os valores dos parâmetros de entrada. Os dois procedimentos a seguir descrevem como configurar esses componentes.

Usar uma tarefa Script para concatenar a cadeia de caracteres de consulta

  1. Na guia Fluxo de Controle, adicione uma tarefa Script ao pacote após o contêiner Loop For e conecte o contêiner Loop For à tarefa.

    ObservaçãoObservação

    Este procedimento assume que o pacote executa uma carga incremental a partir de uma tabela simples. Caso o pacote faça os carregamentos a partir de várias tabelas e tenha um pacote pai com vários pacotes filhos, a tarefa será adicionada como o primeiro componente para cada pacote filho. Para obter mais informações, consulte Executando uma carga incremental de várias tabelas.

  2. No Editor da Tarefa Script, na página Script, selecione as seguintes opções:

    1. Para ReadOnlyVariables, selecione User::DataReady, User::ExtractStartTime e User::ExtractEndTime.

    2. Para ReadWriteVariables, selecione User::SqlDataQuery na lista.

  3. No Editor da Tarefa Script, na página Script, clique em Editar Script para abrir o ambiente de desenvolvimento de script.

  4. No procedimento Principal, digite um dos seguintes segmentos de código:

    • Se você estiver programando em C#, digite a seguinte linha de código:

          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;
      

      - ou -

    • Se você estiver programando em Visual Basic, digite as seguintes linhas de código:

          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. Tire a linha padrão de código que retorna DtsExecResult.Success da execução do script.

  6. Feche o ambiente de desenvolvimento de script e o Editor da Tarefa Script.

Usar uma tarefa Executar SQL para concatenar a cadeia de caracteres de consulta

  1. Na guia Fluxo de Controle, adicione uma tarefa Executar SQL ao pacote após o contêiner Loop For e conecte o contêiner Loop For à essa tarefa.

    ObservaçãoObservação

    Este procedimento assume que o pacote executa uma carga incremental a partir de uma tabela simples. Caso o pacote faça os carregamentos a partir de várias tabelas e tenha um pacote pai com vários pacotes filhos, a tarefa será adicionada como o primeiro componente para cada pacote filho. Para obter mais informações, consulte Executando uma carga incremental de várias tabelas.

  2. Em Editor da Tarefa Executar SQL, na página Geral, selecione as seguintes opções:

    1. Para Conjuntos de Resultados, selecione Linha simples.

    2. Configure uma conexão válida com o banco de dados de origem.

    3. Para SQLSourceType, selecione Entrada direta.

    4. Para SQLStatement, digite a seguinte instrução 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
      
      ObservaçãoObservação

      Neste exemplo, a cláusula else gera uma consulta para a carga inicial dos dados de alteração indicando um valor nulo para a data e hora iniciais. Este exemplo não indica o cenário em que as alterações realizadas antes da captura dos dados de alteração também tenham que ser carregadas para o Data Warehouse.

  3. Na página Mapeamento de Parâmetros do Editor de tarefa Executar SQL, faça o seguinte mapeamento:

    1. Mapeie a variável DataReady para o parâmetro 0.

    2. Mapeie a variável ExtractStartTime para o parâmetro 1.

    3. Mapeie a variável ExtractEndTime para o parâmetro 2.

  4. Na página Conjunto de Resultados do Editor de Tarefa Executar SQL, mapeie o Nome do Resultado para a variável SqlDataQuery.

    O Nome do Resultado é o nome da única coluna que é retornada, SqlDataQuery.

Os procedimentos anteriores configuram uma tarefa que prepara uma cadeia de caracteres de consulta com valores codificados da cadeia de caracteres para os parâmetros de entrada. O código a seguir é um exemplo de uma cadeia de caracteres de consulta:

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

Adicionando uma tarefa de fluxo de dados

A última etapa que projeta o fluxo de controle para o pacote é adicionar uma tarefa de fluxo de dados.

Adicionar uma tarefa de fluxo de dados e completar o fluxo de controle

  • Na guia Fluxo de Controle, adicione uma tarefa de fluxo de dados e conecte a tarefa que concatenou a cadeia de caracteres de consulta.

Próxima Etapa

Após preparar a cadeia de caracteres de consulta e configurar a tarefa de fluxo de dados, a próxima etapa é criar a função com valor de tabela que irá recuperar os dados de alteração do banco de dados.

Próximo tópico:Criando a função para recuperar os dados de alteração

Ícone do Integration Services (pequeno) Fique atualizado com o Integration Services

Para obter os mais recentes downloads, artigos, exemplos e vídeos da Microsoft, bem como soluções selecionadas da comunidade, visite a página do Integration Services no MSDN ou TechNet:

Para receber uma notificação automática sobre essas atualizações, assine os feeds RSS disponíveis na página.