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

Sql server SSIS:如果满足条件,则执行第一个任务,否则跳到下一个,sql-server,ssis,Sql Server,Ssis,我正在了解SSIS,如果问题太简单,我道歉 我在foreach循环-容器中得到了一组任务 第一个任务只需在某个用户变量不为null或空的条件下执行 否则,流程应跳过第一个任务,继续执行第二个任务。 我将如何(详细地)实现这一点呢?这有点棘手 您必须创建一个脚本任务,并检查其中的变量是否为null 首先是脚本任务,其中Main()函数中包含以下代码: public void Main() { if (Dts.Variables["User::yourVariable"].Value !=

我正在了解SSIS,如果问题太简单,我道歉

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

我将如何(详细地)实现这一点呢?

这有点棘手

您必须创建一个脚本任务,并检查其中的变量是否为null

首先是脚本任务,其中Main()函数中包含以下代码:

public void Main()
{
    if (Dts.Variables["User::yourVariable"].Value != null)
    {
        Dts.TaskResult = (int)ScriptResults.Failure;
    }
    else
    {
        Dts.TaskResult = (int)ScriptResults.Success;
    }
}
然后从脚本任务创建两个连接,一个连接到变量不为null时需要执行的任务,另一个连接到下一个任务(如果需要再次检查,如果变量不为null,则连接到另一个脚本)

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

它应该是这样的:


就这样。

希望我没有误解这个问题,但一个可能的解决方案可以写在下面

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

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

这两个任务只显示一个消息框,显示任务已启动

我启动了程序包,第一次和第三次第一个任务都没有启动。在第二个循环中出现消息框(显示“First started”)

之后,您应该设置
firstshouldlrun
变量


正如我在对OP的第一次评论中所提到的,此解决方案基于Amos Wood编写的思想。

我将围绕需要以下条件的任务创建一个
For循环容器
@I
是循环计数器,
@foo
是要测试的用户变量):

  • InitExpression
    @i=0

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


    为此,双击箭头,在“求值操作”中选择“表达式”,然后编写表达式。单击“确定”后,箭头将变为蓝色,表示它不是简单的优先约束,它有一个指定给它的表达式。

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

  • (变量不为Null)或(变量为空)
  • (变量不为Null)或(变量不为空)

    这都是关于“不是”这个词的目的。这些差异很细微,但会影响Foreach循环中第一个任务的执行时间。出于演示目的,我假设您打算#1

    问题2:第一个任务不能再是第一个。为了在BIDS环境中使用SSI完成所需的任务,您需要在以前称为“第一个任务”的任务之前放置另一个任务。这样,您就可以从新的第一个任务设置前一个第一个任务的优先级约束。 通过从托管代码动态设计SSI,可以实现您的期望,但我认为这个问题不能保证与该设计选择相关的开销。 我喜欢使用空序列容器作为“锚”任务—一个仅作为优先约束起点的任务。我大量地记录了它们。我不希望任何人删除“不必要的空容器”,在大厅里晃了几天,摇着头重复“安迪,安迪,安迪……”,但我离题了

    在下面的示例中,我有两个优先约束保留空序列容器。一个转到可以跳过的任务,另一个转到任务后面的任务,该任务有时可以跳过。有时可以跳过的任务与后续任务之间需要第三个优先级约束。请务必注意,必须编辑此第三个优先约束,并将“多个约束”选项设置为或。这允许在采用任何一条相互排斥的前一条路径时执行以下任务。默认情况下,这设置为和,需要两个路径才能执行。根据定义,这不会——不可能——发生在相互排斥的路径上

    我测试名为@MyVar的SSIS字符串变量的值,看看它是Null还是空的。对于离开空序列容器的约束,我使用了Expression Only求值选项。表达方式各不相同,但确立了表达方式的相互排他性。我的Foreach循环容器如下所示:

  • 我希望这有帮助


    :{>

    一个简单的解决方案,而不是一些已经给出的更复杂的解决方案,怎么样?对于要有条件跳过的任务,请在disabled属性中添加一个表达式。任何
    ISNULL(@[User::MY_VAR]) || @[User::MY_VAR]==""