Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como mapear colunas de entrada e saída dinamicamente no SSIS?


Se você criar uma tabela semelhante, poderá usá-la em duas abordagens para mapear colunas dinamicamente dentro do pacote SSIS ou deve compilar todo o pacote programaticamente. Nesta resposta, tentarei fornecer algumas dicas sobre como fazer isso.

(1) Construindo o comando SQL de origem com aliases


Observação:essa abordagem só funcionará se todos os arquivos .dbf tiverem a mesma contagem de colunas, mas os nomes forem diferentes

Nesta abordagem você irá gerar o comando SQL que será utilizado como fonte com base no FileID e na tabela de Mapeamento que você criou. Você deve saber se o FileID e o Caminho do Arquivo .dbf estão armazenados dentro de uma Variável. como exemplo:

Supondo que o nome da tabela seja inputoutputMapping

Adicione uma tarefa Executar SQL com o seguinte comando:
DECLARE @strQuery as VARCHAR(4000)

SET @strQuery = 'SELECT '

SELECT @strQuery = @strQuery + '[' + InputColumn + '] as [' + OutputColumn + '],'
FROM inputoutputMapping
WHERE FileID = ?

SET @strQuery = SUBSTRING(@strQuery,1,LEN(@strQuery) - 1) + ' FROM ' + CAST(? as Varchar(500))

SELECT @strQuery

E na aba Parameter Mapping selecione a variável que contém o FileID a ser mapeado para o parâmetro 0 e a variável que contém o nome do arquivo .dbf (alternativa ao nome da tabela) para o parâmetro 1

Defina o tipo ResultSet como Single Row e armazene o ResultSet 0 dentro de uma variável do tipo string como exemplo @[User::SourceQuery]

O valor do ResultSet será o seguinte:
SELECT [CustCd] as [CustCode],[CNAME] as [CustName],[Address] as [CustAdd] FROM database1

Na OLEDB Source selecione o Table Access Mode to SQL Command da Variable e use @[User::SourceQuery] variável como fonte.

(2) Usando um componente de script como fonte


Nesta abordagem, você deve usar um Script Component como Source dentro da Data Flow Task:

Primeiro de tudo, você precisa passar o caminho do arquivo .dbf e a conexão do SQL Server para o componente de script por meio de variáveis, caso não queira codificá-los.

Dentro do editor de script, você deve adicionar uma coluna de saída para cada coluna encontrada na tabela de destino e mapeá-las para o destino .

Dentro do Script, você deve ler o arquivo .dbf em uma tabela de dados:
  • C# Leia de arquivos .DBF em uma tabela de dados
  • Carregar um DBF em uma DataTable

Após carregar os dados em uma tabela de dados, preencha também outra tabela de dados com os dados encontrados na MappingTable que você criou no SQL Server.

Depois disso, faça um loop sobre as colunas da tabela de dados e altere o .ColumnName para a coluna de saída relevante, como exemplo:
foreach (DataColumn col in myTable.Columns)
    {

    col.ColumnName = MappingTable.AsEnumerable().Where(x => x.FileID = 1 && x.InputColumn = col.ColumnName).Select(y => y.OutputColumn).First(); 

    }

Depois, faça um loop sobre cada linha na tabela de dados e crie uma linha de saída de script.

Além disso, observe que ao atribuir linhas de saída, você deve verificar se a coluna existe, primeiro você pode adicionar todos os nomes de colunas à lista de strings, depois usá-lo para verificar, como exemplo:
var columnNames = myTable.Columns.Cast<DataColumn>()
                             .Select(x => x.ColumnName)
                             .ToList();  


foreach (DataColumn row in myTable.Rows){

if(columnNames.contains("CustCode"){

    OutputBuffer0.CustCode = row("CustCode");

}else{

    OutputBuffer0.CustCode_IsNull = True

}

//continue checking all other columns

}

Se você precisar de mais detalhes sobre como usar um Script Component como fonte, verifique um dos seguintes links:
  • Componente de script SSIS como origem
  • Criando uma fonte com o componente de script
  • Componente de script como fonte – SSIS
  • SSIS – USANDO UM COMPONENTE DE SCRIPT COMO FONTE

(3) Construindo o pacote dinamicamente


Eu não acho que existam outros métodos que você possa usar para atingir esse objetivo, exceto que você tem a opção de construir o pacote dinamicamente, então você deve usar:
  • BIML
  • Modelo de objeto gerenciado dos Serviços de Integração
  • Biblioteca EzApi

(4) SchemaMapper:biblioteca de classes de mapeamento de esquema C#


Recentemente iniciei um novo projeto no Git-Hub, que é uma biblioteca de classes desenvolvida em C#. Você pode usá-lo para importar dados tabulares do excel, word, powerpoint, text, csv, html, json e xml na tabela do servidor SQL com uma definição de esquema diferente usando a abordagem de mapeamento de esquema. confira em:
  • SchemaMapper:biblioteca de classes de mapeamento de esquema C#

Você pode seguir esta página da Wiki para obter um guia passo a passo:
  • Importar dados de vários arquivos em uma tabela SQL passo a passo