Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie ordnet man Eingabe- und Ausgabespalten dynamisch in SSIS zu?

Wenn Sie eine ähnliche Tabelle erstellen, können Sie sie in zwei Ansätzen verwenden, um Spalten innerhalb des SSIS-Pakets dynamisch zuzuordnen, oder Sie müssen das gesamte Paket programmgesteuert erstellen. In dieser Antwort werde ich versuchen, Ihnen einige Einblicke zu geben, wie das geht.

(1) Quell-SQL-Befehl mit Aliasnamen erstellen

Hinweis:Dieser Ansatz funktioniert nur, wenn alle .dbf-Dateien die gleiche Spaltenanzahl haben, aber die Namen unterschiedlich sind

Bei diesem Ansatz generieren Sie den SQL-Befehl, der als Quelle verwendet wird, basierend auf der von Ihnen erstellten FileID und der Zuordnungstabelle. Sie müssen wissen, dass die FileID und der .dbf-Dateipfad in einer Variablen gespeichert sind. als Beispiel:

Angenommen, der Tabellenname ist inputoutputMapping

Fügen Sie mit dem folgenden Befehl einen Task „SQL ausführen“ hinzu:

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

Wählen Sie auf der Registerkarte Parameterzuordnung die Variable aus, die die Datei-ID enthält, die dem Parameter 0 zugeordnet werden soll und die Variable, die den .dbf-Dateinamen (alternativ zum Tabellennamen) enthält, an den Parameter 1

Legen Sie den ResultSet-Typ auf Single Row fest und speichern Sie das ResultSet 0 innerhalb einer Variablen vom Typ String als Beispiel @[User::SourceQuery]

Der ResultSet-Wert lautet wie folgt:

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

In der OLEDB Source Wählen Sie den Tabellenzugriffsmodus für den SQL-Befehl aus Variable und verwenden Sie @[User::SourceQuery] Variable als Quelle.

(2) Verwenden einer Skriptkomponente als Quelle

Bei diesem Ansatz müssen Sie eine Skriptkomponente als Quelle innerhalb der Datenflussaufgabe verwenden:

Zunächst müssen Sie den .dbf-Dateipfad und die SQL Server-Verbindung über Variablen an die Skriptkomponente übergeben, wenn Sie sie nicht fest codieren möchten.

Innerhalb des Skript-Editors müssen Sie eine Ausgabespalte für jede in der Zieltabelle gefundene Spalte hinzufügen und sie dem Ziel zuordnen .

Innerhalb des Skripts müssen Sie die .dbf-Datei in eine Datentabelle einlesen:

  • C# Lesen von .DBF-Dateien in eine Datentabelle
  • Laden Sie einen DBF in eine Datentabelle

Nachdem Sie die Daten in eine Datentabelle geladen haben, füllen Sie auch eine andere Datentabelle mit den Daten aus der MappingTable, die Sie in SQL Server erstellt haben.

Danach durchlaufen Sie die Datentabellenspalten und ändern den .ColumnName in die entsprechende Ausgabespalte, als Beispiel:

foreach (DataColumn col in myTable.Columns)
    {

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

    }

Nachdem Sie jede Zeile in der Datentabelle durchlaufen und eine Skriptausgabezeile erstellt haben.

Beachten Sie außerdem, dass Sie beim Zuweisen von Ausgabezeilen prüfen müssen, ob die Spalte vorhanden ist. Sie können zuerst alle Spaltennamen zur Liste der Zeichenfolgen hinzufügen und sie dann zum Prüfen verwenden, als Beispiel:

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

}

Wenn Sie weitere Informationen zur Verwendung einer Skriptkomponente als Quelle benötigen, überprüfen Sie einen der folgenden Links:

  • SSIS-Skriptkomponente als Quelle
  • Erstellen einer Quelle mit der Skriptkomponente
  • Skriptkomponente als Quelle – SSIS
  • SSIS – EINE SCHRIFTKOMPONENTE ALS QUELLE VERWENDEN

(3) Dynamisches Erstellen des Pakets

Ich glaube nicht, dass es andere Methoden gibt, die Sie verwenden können, um dieses Ziel zu erreichen, außer dass Sie die Wahl haben, das Paket dynamisch zu bauen, dann sollten Sie gehen mit:

  • BIML
  • Integration Services-verwaltetes Objektmodell
  • EzApi-Bibliothek

(4) SchemaMapper:Klassenbibliothek für C#-Schemazuordnung

Vor kurzem habe ich ein neues Projekt auf Git-Hub gestartet, einer Klassenbibliothek, die mit C# entwickelt wurde. Sie können es verwenden, um Tabellendaten aus Excel, Word, Powerpoint, Text, CSV, HTML, JSON und XML in eine SQL Server-Tabelle mit einer anderen Schemadefinition mithilfe des Schemazuordnungsansatzes zu importieren. sieh es dir an unter:

  • SchemaMapper:Klassenbibliothek für C#-Schemazuordnung

Folgen Sie dieser Wiki-Seite für eine Schritt-für-Schritt-Anleitung:

  • Schritt-für-Schritt-Anleitung zum Importieren von Daten aus mehreren Dateien in eine SQL-Tabelle