Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come mappare dinamicamente le colonne di input e output in SSIS?

Se crei una tabella simile, puoi usarla in 2 approcci per mappare le colonne in modo dinamico all'interno del pacchetto SSIS, oppure devi compilare l'intero pacchetto a livello di codice. In questa risposta cercherò di darti alcuni spunti su come farlo.

(1) Creazione del comando SQL di origine con alias

Nota:questo approccio funzionerà solo se tutti i file .dbf hanno lo stesso numero di colonne ma i nomi sono diversi

In questo approccio genererai il comando SQL che verrà utilizzato come sorgente in base al FileID e alla tabella di mappatura che hai creato. Devi sapere che il FileID e il percorso del file .dbf sono archiviati all'interno di una variabile. ad esempio:

Supponendo che il nome della tabella sia inputoutputMapping

Aggiungi un'attività Esegui SQL con il seguente 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 nella scheda Parameter Mapping selezionare la variabile che contiene il FileID da mappare sul parametro 0 e la variabile che contiene il nome del file .dbf (in alternativa al nome della tabella) al parametro 1

Imposta il tipo ResultSet su Single Row e salva il ResultSet 0 all'interno di una variabile di tipo string come esempio @[User::SourceQuery]

Il valore ResultSet sarà il seguente:

SELECT [CustCd] as [CustCode],[CNAME] as [CustName],[Address] as [CustAdd] FROM database1

Nel OLEDB Source seleziona la Modalità di accesso alla tabella al comando SQL da Variabile e usa @[User::SourceQuery] variabile come sorgente.

(2) Utilizzo di un componente di script come origine

In questo approccio devi utilizzare un componente di script come origine all'interno dell'attività del flusso di dati:

Prima di tutto, devi passare il percorso del file .dbf e la connessione di SQL Server al componente di script tramite variabili se non vuoi codificarle.

All'interno dell'editor di script, devi aggiungere una colonna di output per ogni colonna trovata nella tabella di destinazione e mapparli alla destinazione .

All'interno dello Script, devi leggere il file .dbf in un datatable:

  • C# Legge da file .DBF in un datatable
  • Carica un DBF in una DataTable

Dopo aver caricato i dati in un datatable, riempi anche un altro datatable con i dati trovati nella MappingTable che hai creato in SQL Server.

Dopodiché, esegui il ciclo sulle colonne del datatable e modifica il .ColumnName alla colonna di output pertinente, ad esempio:

foreach (DataColumn col in myTable.Columns)
    {

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

    }

Dopo aver eseguito il ciclo su ogni riga nel datatable e creare una riga di output dello script.

Inoltre, tieni presente che durante l'assegnazione delle righe di output, devi verificare se la colonna esiste, puoi prima aggiungere tutti i nomi delle colonne all'elenco di stringhe, quindi utilizzarlo per verificare, ad esempio:

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 hai bisogno di maggiori dettagli sull'utilizzo di un componente di script come sorgente, controlla uno dei seguenti link:

  • Componente script SSIS come origine
  • Creazione di una sorgente con il componente Script
  • Componente script come origine – SSIS
  • SSIS – UTILIZZO DI UN COMPONENTE SCRIPT COME FONTE

(3) Creazione dinamica del pacchetto

Non penso che ci siano altri metodi che puoi usare per raggiungere questo obiettivo, tranne per il fatto che hai la possibilità di creare il pacchetto in modo dinamico, quindi dovresti andare con:

  • BIML
  • Modello a oggetti gestito di Integration Services
  • Libreria EzApi

(4) SchemaMapper:libreria di classi di mappatura dello schema C#

Recentemente ho avviato un nuovo progetto su Git-Hub, che è una libreria di classi sviluppata utilizzando C#. Puoi usarlo per importare dati tabulari da excel, word, powerpoint, text, csv, html, json e xml nella tabella del server SQL con una definizione di schema diversa usando l'approccio di mappatura dello schema. dai un'occhiata a:

  • SchemaMapper:libreria di classi di mappatura dello schema C#

Puoi seguire questa pagina Wiki per una guida passo passo:

  • Importare dati da più file in una tabella SQL guida passo passo