2010-06-24 10 views
5

Ich verwende SSIS, um Daten von Excel zu OLEDB SQL zu transformieren. Ich habe einen Satz Blätter in einem Ordner, den ich durchlaufen muss und lege die Daten in jedes dieser Blätter in eine Tabelle ein. Ich habe ein Szenario, in dem ich eine Reihe von Excel-Blättern durchlaufen muss, die unterschiedliche Spaltenstrukturen haben. Ich kann durch jeden Bogen durch foreach Schleife Enumerator Schleife den Dateinamen finden und sie an die Excel-Quelle weitergeben.SSIS - dynamische Spaltenzuordnungen

Ich möchte wissen, ob es gibt Möglichkeit, diese Spaltenzuordnungen in der Zielkomponente zu entkommen, die in meinem Fall eine OLEDB SQL-Tabelle sein wird. Weil diese Zuordnungen für jede Datei unterschiedlich sind. Gibt es eine Möglichkeit, dies dynamisch zu tun?

Antwort

5

Während Sie in der Schleife eine Skriptaufgabe hinzufügen können, um die Zuordnungen zu ändern, ist dies nicht die einfachste Sache, da Sie jede Zuordnung im Code explizit erstellen müssen. Eine einfachere Lösung bestünde darin, Excel-Blätter durch Textdateien mit Trennzeichen zu ersetzen und sie mithilfe der Bulk-Insert-Task in die Schleife zu importieren. Sie müssen keine Mapping-Informationen angeben, solange die Spaltenreihenfolge in beiden Dateien und Tabellen identisch ist.

Wenn Sie das nicht können, werden Sie die Mapping-Metadaten irgendwo speichern müssen, z. eine Tabelle in Ihrer Datenbank und verwenden Sie diese, um die dynamischen Zuordnungen in einer Skriptaufgabe zu erstellen.

Ein etwas einfacherer Weg besteht darin, nur eine Skriptaufgabe zu verwenden, die die Metadaten zum Konfigurieren eines SqlBulkCopy-Objekts verwendet. Sie verlieren die Flexibilität eines vollständigen Datenflusstasks, aber wenn Sie nur einige Dateien in temp talbes laden möchten, ist dies ausreichend. Außerdem ist es viel einfacher, ein SqlBulkCopy-Objekt als einen Datenflusstask zu konfigurieren.

+0

Wie verwende ich die Skriptaufgabe, um ein SQLBulkcopy-Objekt zu konfigurieren? Gibt es einen Link, den ich benutzen kann? können Sie bitte etwas kürzer sein ... sorry dafür, dass Sie so dumm sind – Baaju

+3

Versuchen Sie die Dokumentation der SqlBulkCopyColumnMapping-Klasse unter http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopycolumnmapping.aspx für ein Beispiel, das benutzerdefinierte Zuordnungen verwendet. Es ist so einfach wie das Bereitstellen eines Quell-Readers (OleDbDataReader für Excel), die Zielverbindung und das Füllen der ColumnMappings-Eigenschaft des SqlBulkCopy-Objekts mit den Namen der Quell- und Zielspalten. Sie können die ColumnMappings-Liste sogar leer lassen. In diesem Fall werden Spalten entsprechend ihrer Ordinalposition zugeordnet - genau wie bei der Bulk-Insert-Task. –