【问题标题】:SSIS Precedence constraints flow based on variable value基于变量值的 SSIS 优先约束流
【发布时间】:2020-03-13 23:56:41
【问题描述】:

我有 SSIS 与逻辑 SQL 检查文件的记录是否存在于 FileList 表中,然后执行。包中有INT32计数变量。

执行 SQL 任务包含 SQL语句:SELECT COUNT(*) AS [count] FROM dbo.FileList WHERE [file] LIKE '%File1%'

参数映射:User::count 输出方向、BYTE 数据类型、0 参数名称和-1 参数大小。

结果集:count,User::count

如果文件存在,则SQL检查任务与后续数据流任务连接或下一次SQL检查(见截图)。

优先约束具有值:成功表达式:@[User::count]>0

另一个优先约束具有值:成功表达式:@[User::count]==0

我想触发验证,因为没有要导入的 File1 并且表中没有 %File1% 记录。

当前执行时,我看到执行 SQL 任务上的绿色勾号,并且执行成功停止,而我希望它在一个或另一个分支上运行。

我在这里做错了什么,如何实现自定义流程以根据表中的可用性检查来运行包?

谢谢!

【问题讨论】:

    标签: visual-studio ssis


    【解决方案1】:

    问题在于导致SQL check File2 的两个先例约束。

    默认行为是两个约束由逻辑AND 绑定,也就是说它们需要TRUE 才能启动下一个任务。但是,鉴于您的流程,您需要一个合乎逻辑的OR,这意味着如果either 约束返回TRUE,则任务将启动。

    右键单击任一约束并更改对话框底部的默认值:

    如图所示,这就是您会发现的。将选择更改为逻辑或后,约束将变为虚线,而不是现在的实线。

    编辑(基于 cmets 中的问题):

    [O]将 File1 添加到文件夹并在数据库中添加 File1 记录后,我仍然看到 Load File1 任务从未启动。它总是去 SQL Check File2 分支。底层查询返回值 1。变量设置有问题吗?

    当我需要将计数传递给变量而不是使用输出参数时,我使用Result Set。在Execute SQL TaskGeneral 选项卡上,将Result Set 设置为Single Row。在编辑器的Result Set 选项卡上,将Result Name 设置为0,然后从Variable Name 列表中选择要将结果映射到的变量。

    这应该确保@count 变量从查询中获取1,并且应该更正调用Load File1 的流程。

    【讨论】:

    • 谢谢埃里克。我更改了设置 Logical OR 和 SQL Check File2 任务启动的两行。但是,一旦我将 File1 添加到文件夹并在数据库中添加 File1 记录,我仍然看到 Load File1 任务永远不会启动。它总是去 SQL Check File2 分支。底层查询返回值1。变量设置有问题吗?
    • @RandyMcKay,我用可能的解决方案编辑了答案。您可能希望在 SQL 任务上放置一个执行后断点,并在 Locals 窗口中验证变量的值,以确保赋值按预期工作。
    • 很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多