SSIS in SQL server 2012 Foreach Folder

Ich kämpfe schon seit einiger time gegen diese Frage und ich scheine keine Fortschritte zu machen und die wenigen Ansätze, die ich gelesen habe, scheinen nicht für mich zu arbeiten (aus welchem ​​Grund auch immer).

Ich habe eine Ordnerstruktur wie folgt:

--Main Folder --subfolder1 --file1.txt --file2.txt --file3.txt --subfolder2 --file4.txt --file5.txt --file6.txt 

Mit dem ForEach File Enumerator bin ich in der Lage, jede der fileen in einem beliebigen Verzeichnis ohne Probleme zu verarbeiten, aber ich kann nicht für das Leben von mir herausarbeiten, wie man durch die Verzeichnisse durchläuft.

Ich habe einen Basispfad, der als Variable gesetzt ist. Was ich versuche, in SSIS zu kommen, ist wie folgt:

 foreach folder in mainfolder do set variable to the folder name (ie subfolder1 (no path)) foreach file in folder do Process File steps (can do this currently by specifying one of the sub folders) done done 

Hoffentlich macht das Sinn.

Wie ich bereits erwähnt habe, habe ich ein paar Ansätze ausprobiert, darunter ein Skript, um einen XML-Blob mit jedem Ordnerpfad zu build und dann durch die Knoten zu iterieren, aber das hat nicht funktioniert und ich bin sicher, dass es einen einfacheren path geben muss es.

Um zusammenzufassen, brauche ich eine foreach Ordner äußere loop, die eine Variable auf den Ordnernamen setzt, so dass ich meine vorhandene foreach fileschlange in ihm verschachteln kann.

Es könnte sein, dass ich versuche, etwas zu tun, was SSIS nicht in der Lage ist zu tun und ich fühle es so, wie ich ähnliche Dinge in Programmiersprachen gemacht habe

Ein Foreach File Enumerator gibt keine Verzeichnisse zurück. Ich war mir nicht bewusst, bis ich anfing, die Frage zu beantworten.

configuration

Ich habe eine Reihe von Ordnern eine file unter dem Basisordner erstellt, genau wie du angegeben hast

 C:\SSISData\31081157 C:\SSISData\31081157\Subfolder1 C:\SSISData\31081157\Subfolder2 C:\SSISData\31081157\Subfolder1\file1.txt C:\SSISData\31081157\Subfolder1\file2.txt C:\SSISData\31081157\Subfolder1\file3.txt C:\SSISData\31081157\Subfolder2\file4.txt C:\SSISData\31081157\Subfolder2\file5.txt C:\SSISData\31081157\Subfolder2\file6.txt 

Ich habe ein Paket mit 4 variables gebaut

  • CurrentFile – string – Wert spielt keine Rolle
  • CurrentFolder – string – Wert spielt keine Rolle
  • FolderBase – string – Setzen Sie diesen Wert auf den Basis- / Root- / übergeordneten Ordner für die Verarbeitung
  • SubFolderList – object

Bildbeschreibung hier eingeben

Runde 1

Mein Anfangsbau sah aus wie

Bildbeschreibung hier eingeben

FELC processordner

Ich stelle dies mit einem Verzeichnis von @ [User :: FolderBase] und linken Traverse Unterordner unchecked. Die Registerkarte Variable Mappings verwendet User :: CurrentFolder als Index 0

FELC processdateien

Ich setze dies mit einem Verzeichnis von @ [User :: CurrentFolder] und meine Registerkarte Variable Mappings verwendet User :: CurrentFile als Index 0

SCR emittieren

Dies ist eine Skriptaufgabe, die zwei Nur-Lese-Parameter akzeptiert: UserFolder und UserBase. Ich werde einfach dazu beitragen, zu zeigen, was die aktuellen Werte sind, indem sie ein OnInformation-Ereignis (das sich in deiner 'Progress' Registerkarte zeigt.

  • ReadOnlyVariables: Benutzer :: CurrentFile, User :: CurrentFolder
  • ReadWriteVariables:

Der Code ist trivial

 public void Main() { bool fireAgain = false; string folderName = this.Dts.Variables["User::CurrentFolder"].Value.ToString(); string fileName = this.Dts.Variables["User::CurrentFile"].Value.ToString(); string message = string.Format("Folder = {0} : File = {1}", folderName, fileName); Dts.Events.FireInformation(0, "Emit", message, string.Empty, 0, ref fireAgain); Dts.TaskResult = (int)ScriptResults.Success; } 

Aber es schießt niemals die innere Schleppe, weil es keine fileen in der äußeren loop gibt. Hoppla

Runde 2

Das ist wahrscheinlich, wie ich dieses Problem in erster Linie lösen würde. Anstatt herauszufinden, alle meine Verzeichnisse zuerst, ich einfach durchqueren den tree und dann herauszufinden, wo ich bin.

Bildbeschreibung hier eingeben

FELC Unterordner

Ich stelle dies mit einem Verzeichnis von @ [User :: FolderBase] und linken Traverse Unterordner überprüft. Die Registerkarte Variable Mappings verwendet User :: CurrentFile als Index 0

SCR Zuweisung von CurrentFolder

Dies ist ein Skript, das die .NET-Bibliotheken verwendet, um den enthaltenen Ordner zu finden

  • ReadOnlyVariables: User :: CurrentFile
  • ReadWriteVariables: User :: CurrentFolder

Code bleibt einfach

 public void Main() { string currentFile = this.Dts.Variables["User::CurrentFile"].Value.ToString(); string parent = System.IO.Directory.GetParent(currentFile).FullName; this.Dts.Variables["User::CurrentFolder"].Value = parent; Dts.TaskResult = (int)ScriptResults.Success; } 

SCR emittieren

Das gleiche wie oben

Runde 3

Dies geht davon aus, dass Sie den Ordner kennen müssen, bevor Sie in ihn eintauchen. In diesem Fall werden wir wieder in die .NET-Bibliothek zurückkehren, um das filesystem zu inspizieren, aber jetzt werden wir unsere letzte Variable User :: SubFolderList mit einer list der Unterordner belegen. Technisch ist es eine Reihe von Saiten, aber egal.

Bildbeschreibung hier eingeben

SCR Generieren von SubFolderList

Eine Skriptaufgabe, die die statice Methode von Directory.GetDirectories verwendet, um unsere list der Ordner zurückzugeben.

  • ReadOnlyVariables: User :: FolderBase
  • ReadWriteVariables: User :: SubFolderList

Code ist auch einfach

 public void Main() { string folder = this.Dts.Variables["User::FolderBase"].Value.ToString(); this.Dts.Variables["User::SubFolderList"].Value = System.IO.Directory.GetDirectories(folder); Dts.TaskResult = (int)ScriptResults.Success; } 

FELC Process SubFolderList

Dies ist ein Foreach Enumerator, aber wir müssen den filetyp aus der fileliste setzen, um Foreach From Variable Enumerator zu Foreach From Variable Enumerator . Als Ihre Variable verwenden Sie @ [User :: SubFolderList]. Die Registerkarte Variable Mappings verwendet User :: CurrentFolder als Index 0

FELC processdateien in CurrentFolder

Nun, da wir wissen, was CurrentFolder ist, dann verwenden wir einen Foreach File Enumerator und geben das Verzeichnis von @ [User :: CurrentFolder] an. Ich setze meine Variable Mappings Registerkarte verwendet User :: CurrentFile als Index 0

SCR emittieren

Das gleiche wie oben

Ergebnisse

Wie Sie sehen können, bekomme ich die gleichen Ergebnisse mit Ansatz 2 und 3. Es hängt nur davon ab, was macht mehr Sinn für Ihren speziellen Anwendungsfall.

Bildbeschreibung hier eingeben