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
Utiliza-se um componente de destino no fluxo de dados de um pacote de Serviços de Integração para guardar dados recebidos de fontes a montante e transformações para uma fonte de dados. Normalmente, o componente de destino liga-se à fonte de dados através de um gestor de ligação já existente.
Para uma visão geral do componente Script, veja Extensão do Fluxo de Dados com o Componente Script.
O componente Script e o código de infraestrutura que gera para si simplificam significativamente o processo de desenvolvimento de um componente personalizado de fluxo de dados. No entanto, para compreender como funciona o componente Script, pode ser útil ler os passos para desenvolver componentes personalizados de fluxo de dados na secção Desenvolver um Componente de Fluxo de Dados Personalizado , e especialmente no Desenvolvimento de um Componente de Destino Personalizado.
Começar com um componente de destino
Quando adiciona um componente Script ao separador Data Flow do SSIS Designer, a caixa de diálogo Select Script Component Type abre-se e pede para selecionar um script de Fonte, Destino ou Transformação . Nesta caixa de diálogo, selecione Destino.
De seguida, ligue a saída de uma transformação ao componente de destino no SSIS Designer. Para testes, pode ligar uma fonte diretamente a um destino sem quaisquer transformações.
Configuração de um componente de destino em modo de design de metadados
Depois de selecionar a opção para criar um componente de destino, configura o componente usando o Editor de Transformação de Scripts. Para mais informações, consulte Configurar o Componente de Script no Editor de Componentes de Script.
Para selecionar a linguagem de scripts que o destino do Script utiliza, defina a propriedade ScriptLanguage na página Script da caixa de diálogo Script Transformation Editor .
Observação
Para definir a linguagem de script padrão para o componente Script, use a opção Linguagem de Scripting na página Geral da caixa de diálogo Opções . Para mais informações, consulte a Página Geral.
Um componente de destino de fluxo de dados tem uma entrada e nenhuma saída. Configurar a entrada do componente é um dos passos que deve completar no modo de design de metadados, usando o Script Transformation Editor, antes de escrever o seu script personalizado.
Adição de gestores de ligação
Normalmente, um componente de destino utiliza um gestor de ligação existente para se ligar à fonte de dados para a qual guarda os dados do fluxo de dados. Na página de Gestores de Ligação do Editor de Transformação de Scripts, clique em Adicionar para adicionar o gestor de conexões apropriado.
No entanto, um gestor de ligação é apenas uma unidade conveniente que encapsula e armazena a informação necessária para se ligar a uma fonte de dados de um determinado tipo. Deve escrever o seu próprio código personalizado para carregar ou guardar os seus dados, e possivelmente para abrir e fechar a ligação à fonte de dados.
Para informações gerais sobre como usar gestores de ligação com o componente Script, consulte Ligar a Fontes de Dados no Componente Script.
Para mais informações sobre a página de Gestores de Ligação do Editor de Transformação de Scripts, consulte Editor de Transformação de Scripts (Página de Gestores de Ligações).
Configuração de entradas e colunas de entrada
Um componente de destino tem uma entrada e nenhuma saída.
Na página de Colunas de Entrada do Editor de Transformação de Scripts, a lista de colunas mostra as colunas disponíveis da saída do componente a montante no fluxo de dados. Selecione as colunas que quer guardar.
Para mais informações sobre a página de Colunas de Entrada do Editor de Transformação de Scripts, consulte Editor de Transformação de Scripts (Página de Colunas de Entrada).
A página de Entradas e Saídas do Editor de Transformação de Scripts mostra uma única entrada, que pode renomear. Refere-se à entrada pelo seu nome no seu script usando a propriedade do acessório criada no código gerado automaticamente.
Para mais informações sobre a página de Entradas e Saídas do Editor de Transformação de Scripts, consulte Editor de Transformação de Scripts (Página de Entradas e Saídas).
Adição de variáveis
Se quiseres usar variáveis existentes no teu script, podes adicioná-las nos campos de propriedades ReadOnlyVariables e ReadWriteVariables na página Script do Script Transformation Editor.
Quando adicionas várias variáveis nos campos de propriedades, separa os nomes das variáveis por vírgulas. Também pode selecionar várias variáveis clicando no botão de reticências (...) ao lado dos campos de propriedades ReadOnlyVariables e ReadWriteVariables , e depois selecionando as variáveis na caixa de diálogo Selecionar variáveis .
Para informações gerais sobre como usar variáveis com o componente Script, consulte Utilização de Variáveis no Componente Script.
Para mais informações sobre a página de Script do Script Transformation Editor, consulte Script Transformation Editor (Script Page).
Scripting de um componente de destino em modo de design de código
Depois de configurares os metadados do teu componente, podes escrever o teu script personalizado. No Editor de Transformação de Scripts, na página Script , clique em Editar Script para abrir o IDE Microsoft Visual Studio Tools for Applications (VSTA), onde pode adicionar o seu script personalizado. A linguagem de scripting que usa depende de ter selecionado Microsoft Visual Basic ou Microsoft Visual C# como linguagem de script para a propriedade ScriptLanguage na página Script .
Para informações importantes que se aplicam a todos os tipos de componentes criados usando o componente Script, veja Codificação e Depuração do Componente Script.
Compreender o código gerado automaticamente
Quando abres o IDE VSTA depois de criares e configurares um componente de destino, a classe editável ScriptMain aparece no editor de código com um stub para o método ProcessInputRow . A classe ScriptMain é onde escreves o teu código personalizado, e o ProcessInputRow é o método mais importante num componente de destino.
Se abrires a janela do Project Explorer no VSTA, podes ver que o componente Script também gerou itens de projeto BufferWrapper e ComponentWrapper apenas de leitura. A classe ScriptMain herda da classe UserComponent no item do projeto ComponentWrapper .
Em tempo de execução, o motor de fluxo de dados invoca o método ProcessInput na classe UserComponent , que sobrepõe o ProcessInput método da ScriptComponent classe pai. O método ProcessInput , por sua vez, percorre as linhas do buffer de entrada e chama o método ProcessInputRow uma vez por cada linha.
Escrever o seu código personalizado
Para terminar de criar um componente de destino personalizado, pode querer escrever scripts nos seguintes métodos disponíveis na classe ScriptMain .
Substitua o método AcquireConnections para se ligar à fonte de dados externa. Extraia o objeto de ligação, ou a informação de ligação necessária, do gestor de ligações.
Substitua o método PreExecute para preparar a gravação dos dados. Por exemplo, pode querer criar e configurar um SqlCommand e os seus parâmetros neste método.
Use o método ProcessInputRow sobreposto para copiar cada linha de entrada para a fonte de dados externa. Por exemplo, para um destino SQL Server, pode copiar os valores das colunas para os parâmetros de um SqlCommand e executar o comando uma vez para cada linha. Para um destino de ficheiro plano, podes escrever os valores de cada coluna num StreamWriter, separando os valores pelo delimitador de coluna.
Sobrepor o método PostExecute para desligar da fonte de dados externa, se necessário, e para realizar qualquer outra limpeza necessária.
Exemplos
Os exemplos seguintes demonstram o código necessário na classe ScriptMain para criar um componente de destino.
Observação
Estes exemplos utilizam a tabela Person.Address na base de dados de exemplo AdventureWorks e passam a sua primeira e quarta colunas, as colunasint AddressID e nvarchar(30)City , pelo fluxo de dados. Os mesmos dados são usados nas amostras de origem, transformação e destino nesta secção. Pré-requisitos e pressupostos adicionais são documentados para cada exemplo.
ADO.NET exemplo de destino
Este exemplo demonstra um componente de destino que utiliza um gestor de ADO.NET de conexões existente para guardar dados do fluxo de dados numa tabela SQL Server.
Se quiser executar este código de exemplo, deve configurar o pacote e o componente da seguinte forma:
Crie um gestor de ligações ADO.NET que utilize o fornecedor SqlClient para se ligar à base de dados AdventureWorks .
Crie uma tabela de destino executando o seguinte comando Transact-SQL na base de dados AdventureWorks :
CREATE TABLE [Person].[Address2]([AddressID] [int] NOT NULL, [City] [nvarchar](30) NOT NULL)Adicione um novo componente Script à superfície do Data Flow designer e configure-o como destino.
Ligue a saída de uma fonte ou transformação a montante ao componente de destino no SSIS Designer. (Pode ligar uma fonte diretamente a um destino sem quaisquer transformações.) Esta saída deve fornecer dados da tabela Person.Address da base de dados de exemplo AdventureWorks que contenha pelo menos as colunas AddressID e City .
Abre o Editor de Transformação de Scripts. Na página de Colunas de Entrada , selecione as colunas de entrada AddressID e City .
Na página de Entradas e Saídas , renomeie a entrada com um nome mais descritivo, como MyAddressInput.
Na página de Gestores de Ligações , adicione ou crie o gestor de conexões ADO.NET com um nome como MyADONETConnectionManager.
Na página de Guião , clique em Editar Guião e insira o guião que se segue. Depois fecha o ambiente de desenvolvimento de guiões.
Fecha o Editor de Transformação de Scripts e executa o exemplo.
Imports Microsoft.Data.SqlClient
...
Public Class ScriptMain
Inherits UserComponent
Dim connMgr As IDTSConnectionManager100
Dim sqlConn As SqlConnection
Dim sqlCmd As SqlCommand
Dim sqlParam As SqlParameter
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
connMgr = Me.Connections.MyADONETConnectionManager
sqlConn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)
End Sub
Public Overrides Sub PreExecute()
sqlCmd = New SqlCommand("INSERT INTO Person.Address2(AddressID, City) " & _
"VALUES(@addressid, @city)", sqlConn)
sqlParam = New SqlParameter("@addressid", SqlDbType.Int)
sqlCmd.Parameters.Add(sqlParam)
sqlParam = New SqlParameter("@city", SqlDbType.NVarChar, 30)
sqlCmd.Parameters.Add(sqlParam)
End Sub
Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)
With sqlCmd
.Parameters("@addressid").Value = Row.AddressID
.Parameters("@city").Value = Row.City
.ExecuteNonQuery()
End With
End Sub
Public Overrides Sub ReleaseConnections()
connMgr.ReleaseConnection(sqlConn)
End Sub
End Class
using Microsoft.Data.SqlClient;
public class ScriptMain:
UserComponent
{
IDTSConnectionManager100 connMgr;
SqlConnection sqlConn;
SqlCommand sqlCmd;
SqlParameter sqlParam;
public override void AcquireConnections(object Transaction)
{
connMgr = this.Connections.MyADONETConnectionManager;
sqlConn = (SqlConnection)connMgr.AcquireConnection(null);
}
public override void PreExecute()
{
sqlCmd = new SqlCommand("INSERT INTO Person.Address2(AddressID, City) " +
"VALUES(@addressid, @city)", sqlConn);
sqlParam = new SqlParameter("@addressid", SqlDbType.Int);
sqlCmd.Parameters.Add(sqlParam);
sqlParam = new SqlParameter("@city", SqlDbType.NVarChar, 30);
sqlCmd.Parameters.Add(sqlParam);
}
public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
{
{
sqlCmd.Parameters["@addressid"].Value = Row.AddressID;
sqlCmd.Parameters["@city"].Value = Row.City;
sqlCmd.ExecuteNonQuery();
}
}
public override void ReleaseConnections()
{
connMgr.ReleaseConnection(sqlConn);
}
}
Exemplo de destino de ficheiro plano
Este exemplo demonstra um componente de destino que utiliza um gestor de ligação Flat File existente para guardar dados do fluxo de dados para um ficheiro flat.
Se quiser executar este código de exemplo, deve configurar o pacote e o componente da seguinte forma:
Crie um gestor de ligações Flat File que se ligue a um ficheiro de destino. O ficheiro não tem de existir; o componente de destino cria-o. Configure o ficheiro de destino como um ficheiro delimitado por vírgulas que contenha as colunas AddressID e City .
Adicione um novo componente Script à superfície do Data Flow designer e configure-o como destino.
Ligue a saída de uma fonte ou transformação a montante ao componente de destino no SSIS Designer. (Pode ligar uma fonte diretamente a um destino sem quaisquer transformações.) Este resultado deve fornecer dados da tabela Person.Address da base de dados de exemplo AdventureWorks , e deve conter pelo menos as colunas AddressID e City .
Abre o Editor de Transformação de Scripts. Na página de Colunas de Entrada , selecione as colunas AddressID e City .
Na página de Entradas e Saídas , renomeie a entrada com um nome mais descritivo, como MyAddressInput.
Na página de Gestores de Ligações , adicione ou crie o gestor de ligações Flat File com um nome descritivo como MyFlatFileDestConnectionManager.
Na página de Guião , clique em Editar Guião e insira o guião que se segue. Depois fecha o ambiente de desenvolvimento de guiões.
Fecha o Editor de Transformação de Scripts e executa o exemplo.
Imports System.IO
...
Public Class ScriptMain
Inherits UserComponent
Dim copiedAddressFile As String
Private textWriter As StreamWriter
Private columnDelimiter As String = ","
Public Overrides Sub AcquireConnections(ByVal Transaction As Object)
Dim connMgr As IDTSConnectionManager100 = _
Me.Connections.MyFlatFileDestConnectionManager
copiedAddressFile = CType(connMgr.AcquireConnection(Nothing), String)
End Sub
Public Overrides Sub PreExecute()
textWriter = New StreamWriter(copiedAddressFile, False)
End Sub
Public Overrides Sub MyAddressInput_ProcessInputRow(ByVal Row As MyAddressInputBuffer)
With textWriter
If Not Row.AddressID_IsNull Then
.Write(Row.AddressID)
End If
.Write(columnDelimiter)
If Not Row.City_IsNull Then
.Write(Row.City)
End If
.WriteLine()
End With
End Sub
Public Overrides Sub PostExecute()
textWriter.Close()
End Sub
End Class
using System.IO;
public class ScriptMain:
UserComponent
{
string copiedAddressFile;
private StreamWriter textWriter;
private string columnDelimiter = ",";
public override void AcquireConnections(object Transaction)
{
IDTSConnectionManager100 connMgr = this.Connections.MyFlatFileDestConnectionManager;
copiedAddressFile = (string) connMgr.AcquireConnection(null);
}
public override void PreExecute()
{
textWriter = new StreamWriter(copiedAddressFile, false);
}
public override void MyAddressInput_ProcessInputRow(MyAddressInputBuffer Row)
{
{
if (!Row.AddressID_IsNull)
{
textWriter.Write(Row.AddressID);
}
textWriter.Write(columnDelimiter);
if (!Row.City_IsNull)
{
textWriter.Write(Row.City);
}
textWriter.WriteLine();
}
}
public override void PostExecute()
{
textWriter.Close();
}
}
Conteúdo relacionado
Criação de uma Fonte com o Componente Script
Desenvolvimento de um Componente de Destino Personalizado