SSIS: exécution de la première tâche, si l'état de rencontré d'autre de passer à la suivante
Je suis arriver à savoir SSIS, je m'excuse si la question est trop simple.
J'ai eu un ensemble de tâches à l'intérieur de un foreach-boucle-conteneur.
Le première tâche ne doit exécutée à condition qu'un certain variable utilisateur n'est pas null ou vide.
Sinon, le flux devrait sauter le première tâche et de continuer à la deuxième.
Comment pourrais-je aller sur la réalisation de ce (en détail) ?
Loon à ce post stackoverflow.com/questions/2804007/.... Vérifier Amos Bois de la réponse, qui je pense va être bon pour vous.
Considérant que, lorsque la tâche est désactivée, vous ne pouvez pas activer de nouveau automatiquement.
Considérant que, lorsque la tâche est désactivée, vous ne pouvez pas activer de nouveau automatiquement.
OriginalL'auteur David | 2012-03-02
Vous devez vous connecter pour publier un commentaire.
Question 1: Il y a deux manières d'interpréter votre logique: "...une certaine variable utilisateur n'est pas null ou vide":
L' (Variable n'est Pas Nulle) OU le (la Variable n'est Pas Vide).
Il est tout au sujet de l'objet(s?) le mot "pas". Les différences sont subtiles, mais aura un impact lors de la première tâche dans la boucle Foreach exécute. Pour les besoins de la démonstration, je suis en supposant que vous avez l'intention no 1.
Question 2: La première tâche peut ne plus l'être. Afin d'accomplir ce que vous désirez à l'aide de SSIS à l'intérieur de la d'OFFRES de l'environnement, vous devez placer une autre tâche à l'avance de la tâche qui autrefois connue comme "la première tâche". Il en est ainsi vous pouvez définir une Contrainte de Précédence sur l'ex-première tâche de la nouvelle première tâche.
Il est possible d'accomplir ce que vous désirez par la conception de votre SSIS de manière dynamique à partir de code managé, mais je ne pense pas que cela justifie les frais généraux associés à ce choix de conception.
J'ai comme l'utilisation d'une Séquence vide Conteneur comme un "point d'Ancrage" de la tâche, tâche qui n'existe que pour servir l'extrémité de départ d'une Contrainte de Précédence. J'ai fortement document comme tel. Je ne veux pas que quiconque de supprimer le "inutiles conteneur vide" et qui rôdent dans les couloirs pendant des jours en secouant la tête et en répétant "Andy, Andy, Andy..." mais je m'égare.
Dans l'exemple ci-dessous, j'ai deux contraintes de précédence laissant la Séquence vide Conteneur. On va à la tâche qui ne peut être ignorée, et l'autre à la tâche la tâche qui peut parfois être ignorée. Une troisième contrainte de précédence entre les tâches qui peuvent parfois être ignorée, et la tâche suivante. Il est important de noter que ce troisième contrainte de précédence doivent être modifiées et les Multiples Contraintes de l'option OU. Cela permet à la tâche à exécuter au moment de l'mutuellement exclusifs précédente chemins sont prises. Par défaut, il est configuré pour ET et nécessitera les deux chemins à exécuter. Par définition, qui ne sera pas - peutpas se produire avec mutuellement exclusifs chemins.
J'ai tester la valeur d'une SSIS variable de Chaîne nommée @MyVar pour voir si elle est Null ou Vide. J'ai utilisé l'Expression Seule Option d'Évaluation pour les contraintes de quitter la Séquence vide Conteneur. Les expressions varient, mais établir la part de l'exclusivité de l'expression. Ma Boucle Foreach Conteneur ressemble à ceci:
J'espère que cette aide.
:{>
OriginalL'auteur Andy Leonard
La meilleure chose peut être à utiliser l'option "Désactiver les propriétés" dans les expressions et donner l'expression par l'état. Il suffit de chercher comment utiliser le désactiver propriété.
OriginalL'auteur Dibin
Que diriez-vous une solution simple au lieu de quelques-uns des plus complexes qui ont déjà été donnés. Pour la tâche que vous souhaitez conditionnellement sauter, ajouter une expression pour les personnes handicapées de la propriété. Toute expression qui produit un résultat vrai ou faux travail, donc, pour la question exemple, vous pourriez utiliser:
Le seul inconvénient est qu'elle ne peut pas aussi visible que sur certains autres solutions, mais il est beaucoup plus facile à mettre en œuvre.
OriginalL'auteur Dave Sexton
Je voudrais créer un
For Loop Container
autour de la tâche qui a besoin de l'état, avec les conditions suivantes (@i
est le compteur de la boucle,@foo
est votre variable utilisateur que vous souhaitez tester):@i=0
@i<1 && !ISNULL(@Foo) && @Foo!=""
@i=@i+1
OriginalL'auteur Ocaso Protal
il n'est pas nécessaire de créer un "script"
Je pense que la meilleure (et la plus simple) consiste à ajouter un vide tâche de script à l'intérieur de votre conteneur de boucles avant de votre "première tâche", faites glisser la flèche verte à partir de votre "première tâche" (qui, évidemment, va devenir le second) et l'utilisation de la contrainte de précédence pour faire le chèque.
Pour ce faire, double-cliquez sur la flèche, sélectionnez "expression" sur "l'évaluation de l'opération" et écrivez votre expression. Après avoir cliquer sur OK la flèche devient bleu indiquant que ce n'est pas une simple contrainte de précédence, il a une expression attribuée à elle.
non, pas du tout. J'utilise cette approche. Depuis le chèque est à l'intérieur de la boucle, il s'arrête seulement que l'interaction et la déplacer de l'un à l'autre
OriginalL'auteur Diego
Heureusement que je n'ai pas de mal comprendre la question, mais une solution possible peut être comme écrit ci-dessous.
J'ai créé un exemple de boucle ForEach. La boucle elle-même est un objet énumérateur. Il énumère les numéros 1, 2, 3. Le acutal valeur est stockée dans une variable appelée
LoopVariable
.Il y a une autre variable nommée
FirstShouldRun
qui est une variable Booléenne indiquant la première tâche dans la boucle foreach devrait être lancé ou pas. J'ai mis la valeur de cette variable EvaluateAsExpression true à la propriété, et son expression est(@[User::LoopVariable] % 2) == 0
. Je voudrais vous montrer avec ce que chaque seconde fois, la première tâche devrait être de commencer.Les deux tâches ne rien faire beaucoup, mais afficher une MessageBox montrant la tâche a été commencé.
J'ai commencé le paquet et le premier et le troisième temps de la première tâche n'a pas commencé. Dans la deuxième boucle de la MessageBox (montrant
"First started"
) est apparu.Après cela, vous devez définir
FirstShouldRun
variable comme vous le souhaitez.Comme je l'ai mentionné dans mon premier commentaire, pour l'OP, cette solution est basée sur l'idée d'Amos Bois écrite dans une autre réponse.
OriginalL'auteur luviktor
C'est un peu délicat.
Vous devez créer une Tâche de Script et de vérifier si la variable n'est pas nulle.
Donc d'abord vous avez la tâche de script dans lequel vous aurez le code suivant dans votre fonction main ():
Ensuite, vous créez deux connexions à partir de votre tâche de script, l'un à la tâche qui doit être exécutée lorsque la variable n'est pas nulle, et l'autre à la tâche suivante (ou à un autre script, si vous avez besoin de vérifier à nouveau, si la variable n'est pas nulle).
Puis vous faites un clic droit sur le (vert) flèche de votre première connexion et sélectionnez "Échec". Cliquez-droit sur la connexion à la tâche suivante /script et de le régler à "l'Achèvement".
Il devrait alors ressembler à ceci:
.
OriginalL'auteur fancyPants