Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SSIS: execute first task if condition met else skip to next

I am getting to know SSIS, I apologize if the question is too simple.

I got a set of tasks inside a foreach-loop-container.
The first task needs only to get executed on condition that a certain user variable is not null or empty.
Otherwise, the flow should skip the first task and continue to the second one.

How would I go about realizing this (in detail) ?

like image 470
David Avatar asked Mar 02 '12 09:03

David


People also ask

How do you write conditional condition split in SSIS?

Add a SSIS Conditional Split Transformation to the Data Flow The Conditional Split Transformation task checks for the specified condition. It moves the data to an appropriate destination depending upon the condition. Drag the SSIS Conditional Split task from the SSIS Toolbox.

What are the precedence constraints in SSIS?

The precedence constraint uses a constraint value, an expression, both, or either to determine whether the constrained executable runs. If the precedence constraint uses an execution result, you can specify the execution result to be success, failure, or completion.

How do you break a loop in SSIS?

You could also use a 'for' loop with a boolean condition such as looping while a variable is equal to true. Then when you want to break out of that loop, simply change the value of that variable to false and then you will break out of the loop.

What is conditional split?

The Conditional Split transformation can route data rows to different outputs depending on the content of the data. The implementation of the Conditional Split transformation is similar to a CASE decision structure in a programming language.


2 Answers

Issue 1: There are two ways to interpret your logic: "...a certain user variable is not null or empty":

  1. The (Variable is Not Null) OR the (Variable is Empty).
  2. The (Variable is Not Null) OR the (Variable is Not Empty).

    It's all about the object(s?) of the word "not". The differences are subtle but will impact when the first task in the Foreach loop executes. For demonstration purposes, I am assuming you intend #1.

    Issue 2: The first task can no longer be first. In order to accomplish what you desire using SSIS inside the BIDS environment, you need to place another task ahead of the task formerly known as "the first task". This is so you can set a Precedence Constraint on the former first task from the new first task. It is possible to accomplish what you desire by designing your SSIS dynamically from managed code, but I don't think this issue warrants the overhead associated with that design choice. I like using an empty Sequence Container as an "Anchor" task - a task that exists solely to serve as the starting endpoint of a Precedence Constraint. I heavily document them as such. I don't want anyone deleting the "unnecessary empty container" and roaming the halls for days shaking their heads and repeating "Andy, Andy, Andy..." but I digress.

    In the example below, I have two precedence constraints leaving the empty Sequence Container. One goes to the task that may be skipped and the other to the task following the task that can sometimes be skipped. A third precedence constraint is required between the task that can sometimes be skipped and the task following. It is important to note this third precedence constraint must be edited and the Multiple Constraints option set to OR. This allows the task following to execute when either of the mutually exclusive previous paths are taken. By default, this is set to AND and will require both paths to execute. By definition, that will not - cannot - happen with mutually exclusive paths.

    I test the value of an SSIS String variable named @MyVar to see if it's Null or Empty. I used the Expression Only Evaluation Option for the constraints leaving the empty Sequence Container. The expressions vary but establish the mutual exclusivity of the expression. My Foreach Loop Container looks like this:

SSIS diagram

I hope this helps.

:{>

like image 80
Andy Leonard Avatar answered Oct 13 '22 07:10

Andy Leonard


The best thing can be to use the 'Disable Property' in expressions and giving the expression as per the condition. Just search how to use the disable property.

like image 34
Dibin Avatar answered Oct 13 '22 07:10

Dibin