【问题标题】:Cascading precedence constraints SSIS级联优先约束 SSIS
【发布时间】:2016-09-23 09:28:24
【问题描述】:

我有一个关于如何在 SSIS 中设置优先约束的问题。

我的包里有以下流程:

  • 执行 SQL 任务返回一个格式为“1111”的字符串值,然后将其存储在名为“data”的变量中
  • 关键在于控制要执行的脚本任务 例如,如果值为“1111”,则所有 4 个脚本都将运行。 如果值为“1011”,则脚本 1、3、4 开始运行......你会得到图片
  • 脚本在所有情况下都依赖于前一个脚本。
  • 约束使用如下表达式计算:例如,对于脚本 2,SUBSTRING(@[User::data], 2,1)=="1"。

问题: 如果其中一个脚本没有运行,那么下一个脚本也不会运行(因为约束永远不会被评估)。例如,对于 data = "1011",脚本 3 和 4 永远不会运行,因为数字 2 永远不会运行...

您知道更好的方法来完成这项工作吗?

将 SQL Server 2008 与 BIDS 结合使用

【问题讨论】:

  • 这取决于您可以拥有多少不同的值,但您可以在SQL task 之后使用conditional split。如果这不可能,请编辑您的脚本,以便当值 1011 到达脚本 2 时,它只是将其传递给脚本 3,而不进行任何转换。
  • @DenStudent 条件拆分是一个“数据流”任务元素,而不是“控制流”。你知道我怎样才能达到最终结果吗?我只有这 4 个脚本。

标签: sql-server sql-server-2008 ssis constraints operator-precedence


【解决方案1】:

我同意@Iamdave 的指示,即在每个脚本中修改您的脚本,在那里检查它是否应该执行而不是使用表达式约束。

但是,因为有人可能想用数据流任务或这里的东西来做这件事,所以这是用 SSIS 组件做的一种方法。您的问题是您想有条件地执行任务,但无论该任务是否被执行,您都想有条件地执行另一个任务。通过将每个脚本任务放置在序列容器中,序列容器之间的优先级将始终使另一个容器执行,只要该先前容器没有失败或没有表达式作为约束。但是一旦进入容器,您就需要能够设置条件优先级。您可以通过在脚本任务之前添加某种虚拟任务并添加对该优先级的约束来做到这一点。

【讨论】:

    【解决方案2】:

    在脚本中添加一些条件代码。

    例如,在脚本任务 1 开始时:

    if firstcharacter(Variable) = 1
        do things
    else
        do nothing
    

    然后在脚本任务2中:

    if secondcharacter(Variable) = 1
        do things
    else
        do nothing
    

    并确保所有数据都通过,只有在满足变量中的正确字符时才会被转换。

    【讨论】:

    • 由于 OP 使用脚本,我认为这是最好的解决方法。但是,如果他的所有脚本任务实际上都是数据流任务,这将不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多