Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server
SSIS Integration Runtime em Azure Data Factory
No fluxo de controlo de um pacote de Serviços de Integração que realiza uma carga incremental de dados de alteração, a terceira e última tarefa é preparar-se para consultar os dados de alteração e adicionar uma tarefa Fluxo de Dados.
Note
A segunda tarefa para o fluxo de controlo é garantir que os dados de alteração para o intervalo selecionado estão prontos. Para mais informações sobre esta tarefa, consulte Determinar se os dados de alteração estão prontos. Para uma descrição do processo global de conceção do fluxo de controlo, veja Captura de Alterações de Dados (SSIS).
Considerações de design
Para recuperar os dados de alteração, irá chamar uma função de valores de tabela Transact-SQL que aceita os extremos do intervalo como parâmetros de entrada e devolve dados de alteração para o intervalo especificado. Um componente de origem no fluxo de dados chama esta função. Para informações sobre este componente fonte, consulte Recuperar e Compreender os Dados de Alteração.
Os componentes fonte mais usados dos Serviços de Integração, incluindo o código-fonte OLE DB, o código-fonte ADO e o código-fonte ADO NET, não conseguem derivar informação de parâmetros para uma função com valores de tabela. Portanto, a maioria das fontes não pode chamar diretamente uma função parametrizada.
Tens duas opções de design para passar os parâmetros de entrada para a função:
Monte a consulta parametrizada como uma cadeia. Pode usar uma tarefa Script ou uma tarefa Execute SQL para montar uma string SQL dinâmica com valores de parâmetros codificados diretamente na string. Depois, podes armazenar esta string numa variável package e usá-la para definir a propriedade SqlCommand de um componente de origem. Esta abordagem tem sucesso porque o componente de origem já não requer informação de parâmetro.
Note
Um script pré-compilado tem menos sobrecarga do que uma tarefa Executar SQL.
Usa um invólucro parametrizado. Em alternativa, pode criar um procedimento armazenado parametrizado como um invólucro que invoca a função parametrizada com valor de tabela. Esta abordagem tem sucesso porque um componente fonte pode obter com sucesso informação de parâmetros para um procedimento armazenado.
Este tópico utiliza a primeira opção de design e monta uma consulta parametrizada como uma cadeia de caracteres.
Preparação da Consulta
Antes de poderes concatenar os valores dos parâmetros de entrada numa única cadeia de consulta, tens de configurar as variáveis de pacote que a consulta precisa.
Para configurar variáveis de pacote
No SQL Server Data Tools (SSDT), na janela Variáveis, crie uma variável com um tipo de dados de cadeia de caracteres para armazenar a cadeia da consulta devolvida pela tarefa Executar SQL.
Este exemplo utiliza o nome da variável, SqlDataQuery.
Com a variável de pacote criada, pode usar uma tarefa Script ou uma tarefa Executar SQL para concatenar os valores dos parâmetros de entrada. Os dois procedimentos seguintes descrevem como configurar estes componentes.
Usar uma tarefa Script para concatenar a cadeia de consulta
No separador Control Flow , adicione uma tarefa Script ao pacote após o contentor For Loop e ligue o contentor For Loop à tarefa.
Note
Este procedimento assume que o pacote realiza uma carga incremental a partir de uma única tabela. Se o pacote for carregado a partir de múltiplas tabelas e tiver um pacote pai com vários pacotes filhos, esta tarefa será adicionada como primeiro componente a cada pacote filho. Para mais informações, veja Realizar uma Carga Incremental de Múltiplas Tabelas.
No Editor de Tarefas de Script, na página de Script , selecione as seguintes opções:
Para ReadOnlyVariables, selecione User::DataReady, User::ExtractStartTime e User::ExtractEndTime do .
Para ReadWriteVariables, selecione User::SqlDataQuery da lista.
No Editor de Tarefas de Scripts, na página Script, clique em Editar Script para abrir o ambiente de desenvolvimento de scripts.
No procedimento principal, introduza um dos seguintes segmentos de código:
Se estiver a programar em C#, introduza as seguintes linhas 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 estiver a programar em Visual Basic, introduza 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
Deixe a linha de código padrão que devolve DtsExecResult.Success a partir da execução do script.
Feche o ambiente de desenvolvimento de scripts e o Editor de Tarefas de Guiões.
Para utilizar uma tarefa Executar SQL para concatenar a cadeia de caracteres da consulta
No separador Control Flow , adicione uma tarefa Executar SQL ao pacote após o contentor For Loop e ligue o contentor For Loop a esta tarefa.
Note
Este procedimento assume que o pacote realiza uma carga incremental a partir de uma única tabela. Se o pacote for carregado a partir de múltiplas tabelas e tiver um pacote pai com vários pacotes filhos, esta tarefa será adicionada como primeiro componente a cada pacote filho. Para mais informações, veja Realizar uma Carga Incremental de Múltiplas Tabelas.
No Editor de Tarefas Executar SQL, na página Geral , selecione as seguintes opções:
Para ResultSet, selecione Uma única linha.
Configure uma ligação válida à base de dados de origem.
Para SQLSourceType, selecione Entrada Direta.
Para SQLStatement, insira 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 SqlDataQueryNote
A cláusula else neste exemplo gera uma consulta para a carga inicial de dados de alteração ao passar um valor nulo para a data e hora de início. Este exemplo não aborda o cenário em que as alterações feitas antes de a captura de dados da alteração ter sido ativada também têm de ser carregadas para o data warehouse.
Na página de Mapeamento de Parâmetros do Editor de Tarefas Executar SQL, faça o seguinte mapeamento:
Mapeie a variável DataReady para o parâmetro 0.
Mapeie a variável ExtractStartTime para o parâmetro 1.
Mapeie a variável ExtractEndTime para o parâmetro 2.
Na página Conjunto de Resultados do Editor da Tarefa Executar SQL, mapeie o Nome do Resultado para a variável SqlDataQuery.
O Nome do Resultado é o nome da única coluna que é devolvida, SqlDataQuery.
Os procedimentos anteriores configuram uma tarefa que prepara uma cadeia de consulta com valores de cadeia codificados fixamente para os parâmetros de entrada. O código seguinte é um exemplo de tal cadeia de consulta:
select * from CDCSample. uf_Customer('2007-06-11 14:21:58', '2007-06-12 14:21:58')
Adicionar uma tarefa de Fluxo de Dados
O último passo no desenho do fluxo de controlo do pacote é adicionar uma tarefa Fluxo de Dados.
Adicionar uma tarefa Fluxo de Dados e completar o fluxo de controlo
- No separador Control Flow, adicione uma tarefa de Fluxo de Dados e ligue-a à tarefa que concatenou a string de consulta.