微软BI 之SSIS 系列 - Precedence Constraint 详解优先约束的使用

开篇介绍

Precedence Constraint 优先约束 - 在控制流中使用,用来链接控制流中各种 Task,Container,并且要求满足一定的条件才能执行相关联的 Task 或者 Container。 比如下图中,第一个 Execute SQL Task 叫做 Precedence-Executable 优先可执行任务,而Script Task 由于在关联箭头的下游,所以它叫做 Constrained-Executable 受约束可执行任务。关联箭头的上游任务自然先执行,关联箭头下方的这种受约束可执行任务是否能够被执行则要取决于 Precedence Constraint 的配置了。

EST_SELECT_VALUE 中的配置 -

查询的结果赋值给一个字符串类型的变量,Script Task 就是显示一下这个变量的值而已。

双击绿色的线之后默认可以看到下面的这个配置,其中包括了约束与多约束的选项和配置。

  1. Evlaution Operation = Constraint  按上游 Task 执行结果决定是否执行下游 Script Task 任务(按执行结果约束)
  2. Value = Success  上游任务 EST_SELECT_VALUE 执行成功后才执行下游 Script Task

EST_SELECT_VALUE 执行成功后自动执行 SCE_SHOW_RESULT

Value = Failure上游任务 EST_SELECT_VALUE 执行失败后才执行下游 Script Task

新建一个 SCR_SHOW_ERROR Script Task,里面不做任何操作。

修改 EST_SELECT_VALUE 与 SCR_SHOW_ERROR 之间的连接线,改成 Failure。

将 EST_SELECT_VALUE 中的 SQL 语句改成 SELECT 1/0 AS A,这样会发生一个除数为零的错误,但是 SCR_SHOW_ERROR 是可以被执行到的。

Value = Complete 上游任务 EST_SELECT_VALUE 无论执行成功或者失败,只要执行完毕就执行下游 Script Task

新建一个 Script Task - SCR_SHOW_COMPLETE,里面不做任何操作。

修改连接线为 Complete。

当 SQL 语句为 SELECT 1/0 AS A  EST_SELECT_VALUE 执行失败时,它被执行到了。

当 SQL 语句为 SELECT 1 AS A  EST_SELECT_VALUE 执行成功时,它也被执行到了。

Evlaution Operation = Expression  按表达式约束,与上游任务执行成功与否的结果无关

添加两个 Script Task - SCR_SHOW_EXP_EMPTY 和 SCR_SHOW_EXP_VALUE。

SCR_SHOW_EXP_EMPTY 的约束配置 -

SCR_SHOW_EXP_VALUE 中的约束配置 -

当 EST_SELECT_VALUE 中的 SQL 为 SELECT 1 AS A 时,PV_RESULT 的值为1,且 EST_SELECT_VALUE 执行成功!

当 EST_SELECT_VALUE 中的 SQL 为 SELECT 1/0 AS A 时,PV_RESULT 的值不能从 EST_SELECT_VALUE 中正常接受,使用默认值 "",且 EST_SELECT_VALUE 执行失败!

可见 SCR_SHOW_RESULT,SCR_SHOW_ERROR,SCR_SHOW_COMPLETE 是否执行只与 EST_SELECT_VALUE 执行的结果有关( Success,Failure,Complete),而与表达式无关。

而 SCR_SHOW_EXP_EMPTY 和 SCR_SHOW_EXP_VALUE 的执行只与表达式相关,而与 EST_SELECT_VALUE 的执行结果无关。

执行结果 AND 表达式 和 执行结果 OR 表达式

新添加四个 Script Task

SCR_SHOW_SUCCESS_&_EMPTY 中的配置要求 Expression 与 Constraint 同时成立。

SCR_SHOW_SUCCESS_OR_EMPTY 中的配置要求 Expression 与 Constraint 有一个成立。

SCR_SHOW_FALIURE_&_VALUE 中的配置要求 Expression 与 Constraint 同时成立。

SCR_SHOW_FALIURE_OR_VALUE 中的配置要求 Expression 与 Constraint 有一个成立。

当 EST_SELECT_VALUE 中的 SQL 为 SELECT 1/0 AS A 时,执行状态 = Failure,PV_RESULT 为 EMPTY 空字符串。

所以 SRC_SHOW_SUCCESS_OR_EMPTY 满足 PV_RESULT =="" 条件,而 SCR_SHOW_FAILURE_OR_VALUE 满足 执行结果 = Failure。

当 EST_SELECT_VALUE 中的 SQL 为 SELECT 1 AS A 时,执行状态 = Success,PV_RESULT 为 1。

所以 SRC_SHOW_SUCCESS_OR_EMPTY 满足执行状态 = SUCCESS 条件,而 SCR_SHOW_FAILURE_OR_VALUE 满足 PV_RESULT !=""。

多约束的情况

SCR_ALL_TRUE 受 EST_SELECT_VALUE_1 和 EST_SELECT_VALUE_2 共同影响。

默认情况下 SCR_ALL_TRUE 的两个优先约束都是如下图所示,这种多约束的情况要表示的意思是。从 EST_SELECT_VALUE_1 到 SCR_ALL_TRUE 只有一个结果就是 True 或者 False,这个 True 或者 False 是由 EST_SELECT_VALUE_1 中的 Constraint/Expression/Constraint and Expression/Constraint or Expression 最终结果得到的 - True 或 False。同样 EST_SELECT_VALUE_2 也能得到一个最终的计算结果 - True 或 False。

也就是说有多个条件约束对 SCR_ALL_TRUE 起约束作用,那么如何实现两种约束共同作用于 SCR_ALL_TRUE 呢?就是下面的 Multiple Constraints 中的 Logical AND 或者 Logical OR 选项来决定的了。

测试条件 1

  1. EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
  2. EST_SELECT_VALUE_2 - SQL = SELECT 1 AS A
  3. Logical AND (虽然是两条约束线,但是更改其中一条,另外一条也会自动更改,也就是说必须同时为 Logical AND 或者 Logical OR)。

测试条件 2

  1. EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
  2. EST_SELECT_VALUE_2 - SQL = SELECT 1/0 AS A
  3. Logical AND

测试条件 3

  1. EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
  2. EST_SELECT_VALUE_2 - SQL = SELECT 1/0 AS A
  3. Logical OR

线条同时变为虚线,执行成功!

测试条件 4

  1. EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
  2. EST_SELECT_VALUE_2 - SQL = SELECT 1/0   AS A  (Constraint - Completion)
  3. Logical OR

线条同时变为虚线,执行成功!

测试条件 5

  1. EST_SELECT_VALUE_1 - SQL = SELECT 1 AS A
  2. EST_SELECT_VALUE_2 - SQL = SELECT 1/0   AS A  (Constraint - Completion)
  3. Logical AND  执行成功!

PS 小窍门

为了更清楚的知道条件表达式和约束的内容,我们可以通过设置约束线的属性让这些信息显示出来,而不是通过人工注释的方式。

选中 Constraint 线,修改其 ShowAnnotation 属性,将 AsNeeded 修改为 ConstraintOptions。

这样就可以清楚的看到约束中的状态判断和表达式判断了!

总结

以上就是 Precedence Constraint 的全部内容!虽然感觉内容比较多,但是这些配置条件在不同的情形中的确会碰到。比如在文件归档任务中,就有类似于这样的条件约束。一种是只要前面加载数据成功就归档,一种是不管前面数据加载成功不成功只要执行完毕就执行归档操作。

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)  如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。

时间: 2024-10-23 22:51:03

微软BI 之SSIS 系列 - Precedence Constraint 详解优先约束的使用的相关文章

微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧

案例背景与需求介绍 之前做过一个美国的医疗保险的项目,保险提供商有大量的文件需要发送给比如像银行,医疗协会,第三方服务商等.比如像与银行交互的 ACH 文件,传送给协会的 ACH Credit 等文件.这些文件格式在美国都是开放的,通用的,可以直接到相关网站下载.也就是说像银行,协会等他们接受这种固定格式的文件,读取数据,读取公司编号进行业务来往或者记录.我当时就是直接在网上搜索到一个 PDF 格式的文件说明,大概有10来页,就是告诉你这个格式是如何定义,应该如何来处理的. 那么这种文件并非像我

微软BI 之SSIS 系列 - 对于平面文件中 NULL 值处理过程中容易极易混淆的几个细节

最近有人问我 OLE DB Destination 中的 Keep Nulls 如何控制 NULL 值的显示,为什么选中了 Keep Nulls 但是数据库中没有 NULL 值? 为什么在 Flat File Source 中勾选上了 Retain null values from the source as null values in the data flow 但是为什么目标表上显示的是一个当前日期,而不是 NULL 值等等,单开此文来解释这些非常容易混淆的概念. 在比较纯粹的 ETL 项

微软BI 之SSIS 系列 - 在 SSIS 中导入 ACCESS 数据库中的数据

开篇介绍 来自 天善学院 一个学员的问题,如何在 SSIS 中导入 ACCESS 数据表中的数据. 在 SSIS 中导入 ACCESS 数据库数据 ACCESS 实际上是一个轻量级的桌面数据库,直接使用文件形式存储.在国内大量使用 ACCESS 作为 BI 数据源并不多,但是在国外特别是美国使用的还比较多,因为他们的 IT 基础起步比较早.在我的第一个美国的医疗保险项目中,就遇到过大量的 ACCESS 数据源,前后总共有 500 多个 ACCESS 表.而现在从国外一些朋友反馈的情况仍然还有在使

微软BI 之SSIS 系列 - 使用 Script Component Destination 和 ADO.NET 解析不规则文件并插入数据

开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中的这种不规则文件,第一行,第二行 Header 部分,第三行的内容 Content 部分,最后一行的 Trailer 部分. 在前几个课程 微软BI SSIS 2012 ETL 控件与案例精讲 第43,44,45,46 课中,我分别讲解了如何使用 .Script Component Source 解

微软BI 之SSIS 系列 - 再谈Lookup 缓存

开篇介绍 关于 Lookup 的缓存其实在之前的一篇文章中已经提到了 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache, NO Cache 但是还是可能遗漏的部分内容,因此在这里重新总结并补充一下.这是第一篇,还是从理论的角度来讨论 Lookup 缓存的问题:后面有空还会再写一篇,从后台 SQL 执行的情况来理解 Lookup 的工作过程. 并且关于 Lookup 缓存还有其它比较有意思的话题,比如我的这些帖子,大

微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug

开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配置,还特意测试过这个细节,获取错误并理解了这个功能.但是现在回去再次测试 2008 的版本时,发现这个功能在 2008 中其实也是错误的,把我印象中的测试结果完全给推翻了,所以到现在已经搞不清楚我当时到底是如果得出这个错误的. 疑似功能 Bug 描述 在 SSIS 包中定义了用户自定义变量 - PV

微软BI 之SSIS 系列 - Lookup 中的字符串比较大小写处理 Case Sensitive or Insensitive

前几天碰到这样的一个问题,在 Lookup 中如何设置大小写不敏感比较,即如何在 Lookup 中的字符串比较时不区分大小写? 实际上就这个问题已经有很多人提给微软了,但是得到的结果就是 Closed and Won’t fix. 说白了,这个就是 By Design,包括到现在的 2012 也没有这个配置选项. https://connect.microsoft.com/SQLServer/feedback/details/339069/ssis-case-sensitive-data-flo

微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件

开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent Job 中周期性的按计划执行,比如每天晚上调用 SSIS 包刷新数据,处理 Cube 等.一旦 SSIS 包中出现任何异常,报错,那么配置在 SQL Agent Job 中的通知,邮件提醒就会把这些错误信息发邮件到指定的用户或者系统维护者,这样就起到了一个错误监控的作用. 但是在有的情况下,有一些自定义的 SSIS 调度框架的计划调度都不是通过 SQL Agent Job 配置来完成的.比如我以前在一个小项目中设计过一个

微软BI 之SSIS 系列 - Execute SQL Task 中的 Single Row 与 Full Result Set 的处理技巧

开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL Task 的场景包含但不止于以下几类: 在从源端加载数据到 Staging 表之前使用 Execute SQL Task 执行一些 Truncate 操作. 执行一些 Log 的插入,更新操作. ETL 过程中的 Merge 语句操作. XML 的输出处理. 关于如何使用 Execute SQL