SSIS: Führe die erste Aufgabe aus, wenn die Bedingung getroffen wurde

7

Ich werde SSIS kennenlernen, ich entschuldige mich, wenn die Frage zu einfach ist.

Ich habe einen Aufgabensatz innerhalb eines foreach-loop- Containers .
Die erste Aufgabe muss nur unter der Bedingung ausgeführt werden, dass eine bestimmte Benutzervariable nicht null oder leer ist.
Sonst sollte der Fluss die erste Aufgabe überspringen und mit der zweiten fortfahren.

Wie würde ich das (im Detail) realisieren?

    
David 02.03.2012, 09:40
quelle

7 Antworten

15

Problem 1: Es gibt zwei Möglichkeiten, Ihre Logik zu interpretieren: "... eine bestimmte Benutzervariable ist nicht null oder leer":

  1. Die (Variable ist nicht Null) ODER die (Variable ist leer).
  2. Die (Variable ist nicht Null) ODER die (Variable ist nicht leer).

    Es geht um das Objekt (s?) des Wortes "nicht". Die Unterschiede sind subtil, wirken sich jedoch aus, wenn die erste Task in der Foreach-Schleife ausgeführt wird. Zu Demonstrationszwecken nehme ich an, dass Sie # 1 vorhaben.

    Problem 2: Die erste Aufgabe kann nicht mehr zuerst sein. Um das zu erreichen, was Sie mit SSIS innerhalb der BIDS-Umgebung erreichen möchten, müssen Sie eine weitere Aufgabe vor der Aufgabe platzieren, die früher als "die erste Aufgabe" bekannt war. Auf diese Weise können Sie eine Vorrangbedingung für die frühere erste Aufgabe der neuen ersten Aufgabe festlegen. Es ist möglich, das zu erreichen, was Sie wünschen, indem Sie Ihr SSIS dynamisch aus verwaltetem Code entwerfen, aber ich glaube nicht, dass dieses Problem den mit dieser Designauswahl verbundenen Overhead garantiert. Ich mag es, einen leeren Sequence Container als "Anchor" -Task zu verwenden - eine Aufgabe, die nur als Startendpunkt einer Precedence Constraint dient. Ich dokumentiere sie stark als solche. Ich möchte nicht, dass irgendjemand den "unnötigen leeren Container" löscht und tagelang durch die Hallen läuft und die Köpfe schüttelt und "Andy, Andy, Andy ..." wiederholt, aber ich schweife ab.

    Im folgenden Beispiel habe ich zwei Vorrangregeln, die den leeren Sequenzcontainer verlassen. Einer geht zu der Aufgabe, die übersprungen werden kann und die andere zu der Aufgabe, die der Aufgabe folgt, die manchmal übersprungen werden kann. Eine dritte Rangfolgeneinschränkung ist zwischen der Aufgabe, die manchmal übersprungen werden kann, und der folgenden Aufgabe erforderlich. Es ist wichtig zu beachten, dass diese dritte Rangfolgeneinschränkung bearbeitet werden muss und die Option Mehrere Abhängigkeiten auf OR gesetzt ist. Dies ermöglicht die Ausführung der Task, wenn einer der sich gegenseitig ausschließenden vorherigen Pfade ausgeführt wird. Standardmäßig ist dies auf AND eingestellt und erfordert beide Pfade zur Ausführung. Per Definition wird das nicht - kann nicht passieren - mit sich gegenseitig ausschließenden Pfaden.

    Ich teste den Wert einer SSIS-String-Variablen namens @MyVar, um zu sehen, ob sie Null oder Leer ist. Ich habe die Expression Only-Evaluierungsoption für die Einschränkungen verwendet, die den leeren Sequenzcontainer verlassen. Die Ausdrücke variieren, begründen jedoch die gegenseitige Exklusivität des Ausdrucks. Mein Foreach-Schleifencontainer sieht folgendermaßen aus:

Ich hoffe, das hilft.

: {& gt;

    
Andy Leonard 05.03.2012, 01:57
quelle
7

Am besten ist es, die 'Eigenschaft deaktivieren' in Ausdrücken zu verwenden und den Ausdruck gemäß der Bedingung anzugeben. Suchen Sie einfach nach der Verwendung der Eigenschaft disable.

    
Dibin 28.08.2013 09:44
quelle
5

Wie wäre es mit einer einfachen Lösung anstelle einiger der komplexeren, die bereits vergeben wurden? Fügen Sie für die Aufgabe, die Sie bedingungslos überspringen möchten, der deaktivierten Eigenschaft einen Ausdruck hinzu. Jeder Ausdruck, der ein richtiges oder falsches Ergebnis liefert, funktioniert. Für das Beispiel der Frage könnten Sie also Folgendes verwenden:

%Vor%

Der einzige Nachteil ist, dass es nicht so sichtbar ist wie einige der anderen Lösungen, aber es ist viel einfacher zu implementieren.

    
Dave Sexton 11.02.2013 13:50
quelle
2

Sie müssen kein "Skript" erstellen Ich denke, der beste (und einfachere) Ansatz besteht darin, vor dem "ersten Task" einen leeren Skript-Task innerhalb des Loop-Containers einzufügen, den grünen Pfeil davon zu Ihrer "ersten Aufgabe" (die offensichtlich die zweite wird) zu ziehen und die Rangfolge-Einschränkung, um die Überprüfung durchzuführen.

Doppelklicken Sie hierzu auf den Pfeil, wählen Sie "Ausdruck" in der "Auswertungsoperation" und schreiben Sie Ihren Ausdruck. Nachdem Sie auf OK geklickt haben, wird der Pfeil blau, um anzuzeigen, dass es sich nicht um eine einfache Rangfolge handelt, sondern um einen Ausdruck.

    
Diego 02.03.2012 12:13
quelle
1

Ich würde eine For Loop Container um die Aufgabe erstellen, die die Bedingung mit den folgenden Bedingungen benötigt ( @i ist der Schleifenzähler, @foo ist Ihre Benutzervariable, die Sie testen möchten):

  1. InitExpression : @i=0
  2. EvalExpression : @i<1 && !ISNULL(@Foo) && @Foo!=""
  3. Zuweisungsausdruck : @i=@i+1
Ocaso Protal 02.03.2012 10:56
quelle
0

Hoffentlich habe ich die Frage nicht falsch verstanden, aber eine mögliche Lösung kann wie unten beschrieben sein.

Ich habe eine Beispiel-ForEach-Schleife erstellt. Die Schleife selbst ist ein Item-Enumerator. Es zählt die Zahlen 1, 2, 3 auf. Der aktuelle Wert wird in einer Variablen namens LoopVariable gespeichert.

Es gibt eine andere Variable mit dem Namen FirstShouldRun , die eine boolesche Variable ist, die anzeigt, dass die erste Aufgabe in der foreach-Schleife ausgeführt werden soll oder nicht. Ich setze die EvaluateAsExpression-Eigenschaft dieser Variablen auf "true" und den Ausdruck " (@[User::LoopVariable] % 2) == 0 ". Ich möchte damit zeigen, dass jedes zweite Mal die erste Aufgabe gestartet werden sollte.

Die beiden Aufgaben machen nicht viel, aber zeigen eine MessageBox an, die anzeigt, dass die Aufgabe gestartet wurde.

Ich startete das Paket und zuerst und das dritte Mal, dass die erste Aufgabe nicht gestartet wurde. In der zweiten Schleife erschien die MessageBox (mit "First started" ).

Danach sollten Sie FirstShouldRun Variable nach Belieben einstellen.

Wie ich in meinem ersten Kommentar zum OP erwähnt habe, basiert diese Lösung auf der Idee von Amos Wood, geschrieben in eine andere Antwort .

    
luviktor 02.03.2012 10:37
quelle
0

Das ist ein bisschen schwierig.

Sie müssen eine Skriptaufgabe erstellen und prüfen, ob Ihre Variable dort nicht null ist.

Also haben Sie zuerst die Skriptaufgabe, in der Sie den folgenden Code in Ihrer Main () Funktion haben werden:

%Vor%

Dann erstellen Sie zwei Verbindungen von Ihrer Skriptaufgabe, eine zu der Aufgabe, die ausgeführt werden muss, wenn Ihre Variable nicht null ist, und eine zur nächsten Aufgabe (oder zu einem anderen Skript, wenn Sie erneut prüfen müssen, ob die Variable ist nicht null).

Dann klicken Sie mit der rechten Maustaste auf den (grünen) Pfeil Ihrer ersten Verbindung und wählen "Fehler". Klicken Sie mit der rechten Maustaste auf die Verbindung zur nächsten Aufgabe / zum nächsten Skript und setzen Sie sie auf "Fertigstellung".

Es sollte dann etwa so aussehen:

Das ist es.

    
fancyPants 02.03.2012 10:11
quelle

Tags und Links