2017-03-06 6 views
3

Ich habe einen in SSIS erstellten Prozess, der Excel-Dateien durchläuft und Daten nur von denen importiert, die den Namen Bericht enthalten.WildCards in SSIS-Sammlung {nicht einschließen} Name xlsx

Meine UserVariable als Ausdruck verwendet wird: *Report*.xlsx und es funktioniert einwandfrei. Jetzt versuche ich, eine ähnliche Schleife zu erstellen, aber nur für Dateien, die nicht Bericht in Dateiname enthalten.

So etwas wie *<>Report*.xlsx

Ist es möglich?

Vielen Dank für Ihre Hilfe!

Matt

+0

Doppelte Frage. Das funktioniert. Habe es einfach ausprobiert. http://stackoverflow.com/questions/19093008/ssis-exclude-certain-files-in-foreach-loop-container – manderson

+0

@manderson das ist kein Duplikat. Es ist eine Art Workaround – Hadi

+0

Ich sagte, duplizieren, weil die Antwort die gleiche ist. Ich wollte diese Antwort im Grunde nicht in diese Frage kopieren, aber da es kein Duplikat ist, habe ich die Antwort für den Benutzer eingegeben. – manderson

Antwort

2

Leider können Sie diese mit SSIS Ausdruck nicht erreichen (so etwas wie *[^...]*.xlsx) Sie für einige Abhilfen zu suchen haben:

Umgehungen

Erste

Get Liste von - gefilterten - Dateien mit einem Execute Script Task vor dem Eintritt in Loop und Schleife über t Henne ForEach-Schleifencontainer (Ado enumerator)

  1. Sie müssen aa SSIS Variable (ex: User::FilesList) mit mit Typ System.Object(Scope: Package)
  2. hinzufügen Execute Script Task vor dem die für jede Schleife Behälter und User::FilesList als Readwrite Variable
  3. im Skript hinzufügen schreiben Sie folgenden Code:

    Importe System.Linq Importe System.IO Importe System.Collections.Generisches

    Public Sub Main() 
        Dim lstFiles As New List(Of String) 
        lstFiles.AddRange(Directory.GetFiles("C:\Temp", "*.xlsx", SearchOption.TopDirectoryOnly).Where(Function(x) Not x.Contains("Report")).ToList) 
    
        Dts.Variables.Item("FilesList").Value = lstFiles 
    
        Dts.TaskResult = ScriptResults.Success 
    End Sub 
    
  4. In der für jede Schleife Container Wählen Enumertaion Typ wie 'Von der Variable Enumerator' und wählen FilesList Variable als Quelle

ScreenShots

enter image description here

enter image description here

enter image description here

Zweite

Innerhalb der für jede Schleife eine Expression Task hinzufügen zu überprüfen, ob die Datei Report Zeichenfolge enthält oder nicht

  1. eine Variable vom Typ System.Booleanhinzufügen (Name: ExcludeFile)
  2. Innerhalb der foreach-Schleife Container fügen Sie eine Expression Task Komponente vor dem DataFlowTask Sie, dass die Excel-Datei

enter image description here

  1. Inside The Expression Aufgabe schreiben Sie die folgenden Importe:

    @[User::ExcludeFile] = (FINDSTRING(@[User::XlsxFile], "Report", 1) == 0) 
    

enter image description here

  1. Doppelklick auf das Verbindungsstück zwischen dem Ausdruck Aufgabe und der DataFlowTask und schreiben Sie den folgenden Ausdruck

    @[User::ExcludeFile] == False 
    

enter image description here

Hinweis: Es ist nicht notwendig, eine Expression Task zu verwenden, um dies zu überprüfen können Sie eine Dummy DataFlowTask oder Skript Aufgabe zu überprüfen Wenn der Dateiname das Schlüsselwort enthält, das Sie ausschließen möchten oder nicht

1

In der Schleife, setzen Sie ein Script Aufgabe vor der ersten Aufgabe. Verbinde diese beiden mit einer Linie. Klicken Sie mit der rechten Maustaste auf diese Zeile und legen Sie die Einschränkungsoptionen auf Ausdruck fest. Ihr Ausdruck würde folgendermaßen aussehen:

FINDSTRING(@var, "Report", 1) == 0 

Wo @var ist die Schleife iterable.

Nur Dateien ohne "Report" werden mit dem nächsten Schritt fortgesetzt.

Verweis auf diese genaue Antwort. SSIS Exclude certain files in Foreach Loop Container