SSIS: Komplexe Dateiselektion ForEach-Schleifencontainer
Der häufigste Anwendungsfall für einen ForEach-Schleifencontainer ist das vollständige
Auflisten von Dateien in einem Verzeichnis. Die aufgelisteten Dateien werden anschließend meist weiterverarbeitet.
Die Selektionsmöglichkeiten im ForEach-Schleifencontainer sind allerdings begrenzt:
Man kann :
- den Ordner angeben
- Unterordner bei der Suche mit einbeziehen
- Dateien unter Berücksichtigung von Wildcards selektieren
Weitere Details zur ForEach-Schleifencontainer finden Sie in der
Microsoft
Onlinehilfe:
Es ist aber nicht möglich, die Dateiauswahl darüber hinaus einzuschränken. Sollen nur Dateien
ab einem bestimmten Änderungsdatum eingelesen werden oder sowohl CSV-Dateien als auch TXT-Dateien,
dann muss der ForEach-Schleifencontainer erstmal passen.
Dieses Problem kann man lösen, indem eine Dateiselektion dem ForEach-Schleifencontainer vorgeschaltet
wird und die selektierten Dateinamen in einem DataTable an den ForEach-Schleifencontainer
übergeben werden. Für die Übergabe wird eine Objektvariable verwendet, die mittels des ForEach-ADO-Enumerators eingelesen wird.
Das hört sich vielleicht etwas kompliziert an, aber intern macht der ForEach-Container eigentlich
nichts anders.
- Legen Sie zwei Paketvariablen an:

- Bauen Sie folgenden Workflow in der Ablaufsteuerung auf:

- In der vorgeschalteten Skripttask referenzieren sie in der Eigenschaft ReadWriteVariables
auf die Variable DataTable.
- Im Skript geben Sie folgenden Programmcode ein:
Imports System
Imports System.IO
Imports System.Data
Public Class ScriptMain
Public Sub Main()
Dim DT As New DataTable
Dim DR As DataRow
Dim DC As New DataColumn("File", GetType(String))
DT.Columns.Add(DC)
Dim i As Int32
Dim ArrFiles() As String = Directory.GetFiles("c:\aus", "*.zip")
For i = 0 To ArrFiles.Length - 1
DR = DT.NewRow
DR("File") = ArrFiles(i)
DT.Rows.Add(DR)
Next
ArrFiles = Directory.GetFiles("c:\aus", "*.xls")
For i = 0 To ArrFiles.Length - 1
DR = DT.NewRow
DR("File") = ArrFiles(i)
DT.Rows.Add(DR)
Next
Dts.Variables("DataTable").Value = DT
Dts.TaskResult = Dts.Results.Success
End Sub
End Class
Zusätzlich müssen Sie im Projektexplorer einen Verweis auf die System.XML hinzufügen.
Dies ist notwendig, um in der obigen Form auf DataSets und DataTable zugreifen zu können.
Im obigen Beispiel werden alle *.zip und *.xls-Dateien im Verzeichnis C:\aus aufgelistet. Das Dateiverzeichns und die Dateiselektion können Sie natürlich entsprechend Ihren
Anforderungen anpassen.
Es ist möglich, beliebig komplexe Selektionen zu programmieren.
Die gefundenen Dateien
werden in einer DataTable (DT) gespeichert.
Dieses DataTable (DT) wird zum Abschluss an die Objektvariable DataTable übergeben:
Dts.Variables("DataTable").Value = DT
- Im Foreach-Schleifencontainer darf jetzt natürlich nicht mehr direkt über
das Dateiverzeichnis iteriert werden. Der Input wird ja über das vorselektierte
DataTable zur Verfügung gestellt. So wird als Enumerator der Foreach-ADO-Enumerator ausgewählt. Die ADO-Objektquellvariable ist unsere Benutzer-Variable <DataTable>:
- Nun müssen Sie noch die Variablenzuordnung durchführen:

Der Index ist Null-basierend. Die Spalten der DataTable werden aufsteigend hochgezählt.
Da wir nur eine Spalte verwenden, hat diese Spalte den Index 0.
Im Beispielpaket wird abschließend die Variable File mit einer Skripttask in einer Messagebox
angezeigt.
Das vollständige Beispielpaket steht auch zum Download bereit:
Berthold Neumann
02. Juni. 2006
Letzte Änderung: 2.November. 2007