SSIS:如果条件满足则执行第一个任务否则跳到下一个

时间:2012-03-02 09:40:18

标签: sql-server ssis

我开始了解SSIS,如果问题太简单,我道歉。

我在的foreach-loop- 容器中有一组任务。
第一个任务只需要执行条件某个用户变量不为空或空
否则,流程应跳过第一个任务并继续到第二个。

我将如何实现这一点(详细信息)?

7 个答案:

答案 0 :(得分:15)

问题1:有两种方法可以解释您的逻辑:“......某个用户变量不为空或空”:

  1. (变量不为空)或(变量为空)。
  2. (变量不为空)或(变量不为空)。

    所有关于“不是”这个词的对象(s?)。差异很微妙,但会在Foreach循环中的第一个任务执行时产生影响。出于演示目的,我假设您打算#1。

    问题2:第一项任务不再是第一项。为了在BIDS环境中使用SSIS实现您想要的任务,您需要在先前称为“第一个任务”的任务中放置提前的任务。这样您就可以在新的第一个任务中为前一个任务设置优先约束。 通过从托管代码动态设计SSIS,可以实现您的需求,但我认为这个问题不能保证与该设计选择相关的开销。 我喜欢使用一个空的Sequence Container作为“Anchor”任务 - 一个仅作为Precedence Constraint的起始端点存在的任务。我大量记录它们。我不希望任何人删除“不必要的空容器”并漫游大厅几天摇头并重复“安迪,安迪,安迪......”但我离题了。

    在下面的示例中,我有两个优先约束,留下空的Sequence Container。一个是可以跳过的任务,另一个是有时可以跳过的任务之后的任务。在有时可以跳过的任务和后续任务之间需要第三个优先约束。请务必注意,必须编辑第三个优先约束,并将Multiple Constraints选项设置为OR。这允许在执行任何互斥的先前路径时执行后续任务。默认情况下,它设置为AND,并且需要两个路径才能执行。根据定义,不会 - 不会 - 与互斥路径发生。

    我测试名为@MyVar的SSIS String变量的值,看它是否为Null或Empty。我使用仅表达式评估选项来保留空序列容器的约束。表达式各不相同,但建立了表达式的互斥性。我的Foreach循环容器看起来像这样:

  3. SSIS diagram

    我希望这会有所帮助。

    :{>

答案 1 :(得分:8)

最好的方法是在表达式中使用'Disable Property'并根据条件给出表达式。只需搜索如何使用禁用属性。

答案 2 :(得分:6)

如何使用简单的解决方案而不是已经给出的一些更复杂的解决方案。对于要有条件跳过的任务,请将表达式添加到disabled属性。任何产生true或false结果的表达式都可以使用,因此对于问题示例,您可以使用:

ISNULL(@[User::MY_VAR]) || @[User::MY_VAR]==""

唯一的缺点是,它可能不像其他一些解决方案那样可见,但实施起来要容易得多。

答案 3 :(得分:1)

我会在需要条件的任务周围创建一个For Loop Container,并满足以下条件(@i是循环计数器,@foo是您要测试的用户变量):

  1. InitExpression @i=0
  2. EvalExpression @i<1 && !ISNULL(@Foo) && @Foo!=""
  3. AssignExpression @i=@i+1

答案 4 :(得分:1)

无需创建“脚本” 我认为最好(也更简单)的方法是在你的“第一个任务”之前在循环容器中添加一个空白脚本任务,将绿色箭头从它拖到你的“第一个任务”(显然将成为第二个任务)并使用执行检查的优先约束。

为此,双击箭头,在“评估操作”中选择“表达式”并编写表达式。点击OK后,箭头将变为蓝色,表示它不是简单的优先约束,它有一个分配给它的表达式。

答案 5 :(得分:0)

这有点棘手。

您必须创建一个脚本任务并检查您的变量是否为空。

首先,你有一个脚本任务,你将在Main()函数中拥有以下代码:

public void Main()
{
    if (Dts.Variables["User::yourVariable"].Value != null)
    {
        Dts.TaskResult = (int)ScriptResults.Failure;
    }
    else
    {
        Dts.TaskResult = (int)ScriptResults.Success;
    }
}

然后从脚本任务创建两个连接,一个连接到您的变量不为空时需要执行的任务,一个连接到下一个任务(或另一个脚本,如果需要再次检查,如果变量不为空)。

然后右键单击第一个连接的(绿色)箭头,选择“失败”。右键单击与下一个任务/脚本的连接,并将其设置为“完成”。

它应该看起来像这样:

example

就是这样。

答案 6 :(得分:0)

希望我没有误解这个问题,但可能的解决方案如下所示。

我创建了一个ForEach循环示例。循环本身是一个项目枚举器。它枚举数字1,2,3。实际值存储在名为LoopVariable的变量中。

Sample Foreach loop

Settings of the loop

Assigning to variable

还有另一个名为FirstShouldRun的变量,它是一个布尔变量,显示foreach循环中的第一个任务是否应该运行。我将此变量的EvaluateAsExpression属性设置为true,其表达式为(@[User::LoopVariable] % 2) == 0。我想用此证明每次第一次任务应该开始。

Variables

Setting of the property of the variable

这两项任务没什么作用,只显示一个MessageBox,显示任务已经开始。

我首先启动了软件包,第一次没有启动第一个任务。在第二个循环中,出现了MessageBox(显示"First started")。

之后,您应该根据需要设置FirstShouldRun变量。

正如我在对OP的第一次评论中提到的,这个解决方案是基于another answer中写的Amos Wood的想法。