介绍

在本文中,我们会实验 MaximumErrorCount和ForceExecutioResult 故障容差属性,并且还要学习Control Flow task errors, event handlers 和 containers 的联系

关于 SSIS Task Errors

打开 Precedence.dtsx 包. 你的Control Flow 显示如下:

图 1

再做测试前我们先调整两个优先约束.   Script Task 4 和 Script Task 3  调整如下:

图 2

Evaluation operation 选 Expression and Constraint 意味着 表达式和执行状态都必须为Ture . 本列中的表达式MyBool的值必须为Ture,任务运行必须失败. 这样这个Task才算运行成功.

Script Tasks 2 和3 的优先约束配置如下:

图 3

只验证 Expression 表示只要表达式为True即可.  本例中表达式MyBool 的值为Ture那么task就执行成功,任务的执行状态直接忽略.

Execute a Test

按 F5  执行包(注意MyBool的值设置为True) 提示 Succeed Script Task 4?的死后选择No按钮:


图 4

如果你选择了No 按钮, Script Task 4 执行失败

图 5

Script Task 4 失败是因为我们选择No按钮,那为什么 Sequence Container 1 也失败呢?

事件冒泡 Events “Bubble”

错误是一个事件(event) An error is an event and events bubble. What is bubbling? 点击 Package Explorer . 展开 \Executables\Sequence Container 1\Executables\ 节点, 如图:

图 6

Script Task 4 执行失败,然后引发一个错误事件(这个时候 Script Task4 出现了一个红X表示Task失败) . 随后错误事件传递给Sequence Container 1 .由于这个错误在Sequence Container 1里面,所以Sequence Container 1也显示失败 .这种”范围提升”错误事件的传递叫做“冒泡(bubbling).” 这种错误事件不会停在 Sequence Container 1;  它会一直冒到 Precedence 包.

默认情况下错误事件会导致task或者container 失败 . 接下来我们看看如何操作默认属性.

MaximumErrorCount 属性

所有 tasks, 包括Script Task 4, 都有 MaximumErrorCount 属性. 默认情况下 MaximumErrorCount 属性是 1,也就是说只要出现一个错误就会导致task失败. 我们可以把这个属性改为99 ,如下图 :

图 7

再次执行包.我们发现 Sequence Container 1 还是失败了:

图 8

为什么会这样?  原因是 MaximumErrorCount 属性是专为 container设计的, 也就是说 MaximumErrorCount 用在task 上没有效果. 那如果我把Sequence Container 1 的MaximumErrorCount 属性改为99会怎么样?:

图 9

Sequence Container 1 显示成功.

大多数时候我希望出现一个错误,那么包就失败. 但是偶尔我希望把错误全部忽略. 为什么呢? 简单的说就是,忽略错误并不会阻止事件处理. 在本系列的第十篇文章(Advanced Event Behavior – Step 10 of the Stairway to Integration Services),我会进行解释. 我的好友 Julie Smith 分享了一个小技巧: 把MaximumErrorCount 属性设置为 0,也会忽略错误.

图 10

ForceExecutionResult 属性

另外一个使得Sequence Container 1 执行成功的方法是设置容器的 ForceExecutionResult 属性. 先把 MaximumErrorCount 属性改回默认值1 .然后把  ForceExecutionResult  属性改为 Success, 如下图 :

图 11

执行效果如下,即使 MaximumErrorCount  设为1 ,还是会被ForceExecutionResult忽视掉  :

图 12

错误事件 Error Events

每次Control Flow task错误.都会引起一个错误事件(Error Event). 错误事件会被记录然后往上传递. 在Event Handler 添加一个 OnError的 Script Task .我们看看 Error Event属性都有什么东东.

首先, 点击Control Flow 的 Script Task 4 . 然后点击 Event Handlers 标签 :

 
图 13

Event Handler 标签点开后,默认是没有配置的 OnErrorr Event Handler:

图 14

注意:你可以选择Executable的下拉项来选择其他 SSIS 包 :

 
图 15

当然那 Event handler 也可以选择. :


图 16

最后点击 “Click here to create an ‘OnError’ event handler for executable ‘Script Task 4’ :


图 17

点击后,看下OnError event handler的toolbox :

 
图 18

看上去很熟悉?  必须这样, 这个是 Control Flow toolbox!  . 提供SSIS workflows 事件处理.响应事件.(我用的VS2013 ..看起来完全没变化..) . Event handlers 包括一组变量:


图 19

注意,这些是系统变量,如果你看到没显示,那么就是没把显示系统变量的钩打上. :


图 20

为了演示这些事件处理变量是如何工作的,拖一个 Script Task 到 OnError event handler 界面. 打开以后把 ScriptLanguage 属性设置为“Microsoft Visual Basic 2008” . 然后点击ReadOnlyVariables 选择下面几个变量System::ErrorCode, System::ErrorDescription, 和 System::SourceName :


图 21

点击OK按钮, 显示如下 :

 
图 22

点击e Edit Script 按钮,然后在 Public Sub Main() 里面把下面VB代码贴进去:

Dim iErrorCode As Integer = _
Convert.ToInt32(Dts.Variables("ErrorCode").Value)
Dim sErrorDescription As String = _
Dts.Variables("ErrorDescription").Value.ToString
Dim sSourceName As String = _
Dts.Variables("SourceName").Value.ToString
Dim sSubComponent As String = _
"Script Task 4 OnError Event Handler"
Dim sMsg As String = "Source: " & sSourceName & vbCrLf & _
"Error Code: " & iErrorCode.ToString & _
vbCrLf & _
"Error Description: " & _
sErrorDescription MsgBox(sMsg, , sSubComponent) Dts.TaskResult = ScriptResults.Success

Listing 1

Script Task Errors

如果 Script Task 没法定位 ReadOnlyVariables 属性指定的变量.就会报类似下面的错误:

Error: Failed to lock variable "System::ErrorCod" for read access with error 0xC0010001 "The variable cannot be found. This occurs when an attempt is made to retrieve a variable from the Variables collection on a container during execution of the package, and the variable is not there. The variable name may have changed or the variable is not being created.".
Listing 2

我碰到到这个错误是把System::ErrorCode 最后一个’e’漏掉了. 然后执行后报错 :

图 23

Task 执行出错,然后显示如下:

 
图 24

你可能会问为什么错误提示‘Failed to lock variable’(无法锁定变量)? 这个问题很好,因为在Script Task 使用SSIS变量之前,它先’锁定’.具体为什么要这样做.超出了我们文档的范围.  当Script Task 成功的锁定  SSIS 变量. 然后就可以访问了.

----后面还有一些其他写错情况解释…我就不翻译了….有兴趣的同学请看原文

观察一个错误(Observing an Error )

执行该SSIS 包,当弹出 Script Task4 的提示框以后选择 No 按钮:

图 27

点击 No 以后触发一个错误事件.   Script Task 的 OnError 事件接收到这个错误,然后执行并显示错误信息:

图 28

更多关于冒泡 More about Bubbling

早先时候,我们提到事件的”冒泡”.本例中, Script Task4 的错误事件同样会网上传递到 Sequence Container 1. 如果我们在Sequence Container 1上配置 OnError 事件处理. 我们可以观察整个过程.

在Control Flow面板上,点击 Sequence Container 1. 然后点击 Event Handler 标签. 同之前一样,点击” create an OnError event handler for Sequence Container 1”.  然后把Script Task4 OnError 事件的 Script Task 复制黏贴到Sequence Container 1 OnError 事件处理面板中 :

图 29

编辑脚本 Script button. 把其中其中一行改掉:

Dim sSubComponent As String = _
"Sequence Container 1 OnError Event Handler"
右击 Script Task 并执行. 直接结果应该类似下面截图: 

图 30

现在执行整个 SSIS 包.Script Task 4出现提示的时候点击No 按钮, 同之前一样OnError 事件显示如下:

图 31

点击OK以后, 错误事件会冒泡到 Sequence Container 1 OnError 事件:

图 32

这个错误会继续’冒泡’到整个包.大伙可以试下

原文连接:

http://www.sqlservercentral.com/articles/Integration+Services+(SSIS)/93432/

项目文件:

My_First_SSIS_Project_Level_9.7z

[译]Stairway to Integration Services Level 9 - Control Flow Task Errors的更多相关文章

  1. [译]Stairway to Integration Services Level 16 – Flexible Source Locations (多文件导入)

    介绍 在本文中我们将利用SSIS参数,变量 以及 Foreach Loop Container 从多个源动态导入数据. 开始前我们先下载一些数据.WeatherData_Dec08_Apr09.zip ...

  2. [译]Stairway to Integration Services Level 12 - 高级日志配置

    介绍 本文中,我们将结合之前学习的时间冒泡,日志记录,以及复制模型.建立一个自定义的SSIS包日志模型. SSIS Task事件回顾    Reviewing SSIS Task Events 在做实 ...

  3. [译]Stairway to Integration Services Level 10 - 高级事件活动

    介绍 在前一篇文章中我们介绍了故障容差相关的 MaximumErrorCount 和 ForceExecutionResult 属性.  同时我们学习了SSIS Control Flow task e ...

  4. [译]Stairway to Integration Services Level 18 – 部署和执行

    介绍 在本文中,我们要创建一个SSIS Catalog 实例,部署我们的项目,并且运行 weather data loader 包. SSIS 2012 部署模型   SSIS 2012 Deploy ...

  5. [译]Stairway to Integration Services Level 15 – SSIS 参数回顾

    介绍 在本文中我们会研究SSIS变量姐妹: SSIS 变量. 我们会演示参数配置,通过包参数管理动态属性值,然后会演示SSIS包执行的时候参数怎么被配置的. SSIS Parameters 101 S ...

  6. [译]Stairway to Integration Services Level 13 - SSIS 变量回顾

    介绍 在前一篇中我们组合了已经学过的事件冒泡 event bubbling, 日志记录 logging, 和父子模型 Parent-Child pattern 建立了自定义的SSIS包日志记录. 本文 ...

  7. [译]Stairway to Integration Services Level 11 - 日志配置

    介绍 在前一个章节我们讨论了事先行为,分享了如何操作默认的行为和时间冒泡,并且介绍了父子模型. 本文中,我们会配置SSIS日志. 进行简单及高级日志配置,存储,和检索的实验.并且生成自定义日志信息. ...

  8. [译]Stairway to Integration Services Level 6 - SSIS 工作流管理基础

    简介 在之前的章节中,我们学习了增量载入数据. 本文中.我们通过优先约束(Precedence Constraints)来管理SSIS的工作流. 添加一个SSIS包 图 1 将新建的Package1. ...

  9. [译]Stairway to Integration Services Level 4 - 增量更新数据

    在本文中, 我们说下增量更新数据:即将数据源中更新了的数据替换掉目标表中对应的数据. 更新代码 操作之前我们先把目标表e (dbo.Contact). 的数据改掉 Use AdventureWorks ...

随机推荐

  1. 1 2 5 10 20 --> 800

    用1元 2元 5元 10元 20元的钞票凑成800元的方法种数计算,使用了动态规划. 结果没打出来,只是保留在函数里各个vector中,调试可看所有结果. 优点:快 缺点:占空间占内存 耗时时间测试: ...

  2. Python2.7.3 学习——第一个程序 Hello Python World

    Hello World 每学一门语言开始的第一程序都是Hello World ,当然了Python也不例外,下面开始我们的Python第一个程序编写: 1,命令行: (1)打开终端,输入python, ...

  3. 由Mifare 1卡破解带来的危险以及应对方法

    今年年初以来,一个消息的传出震惊了整个IC卡行业.最近,德国和美国的研究人员成功地破解了NXP的Mifare1芯片的安全算法.Mifare1芯片主要用于门禁系统访问控制卡,以及一些小额支付卡,应用范围 ...

  4. css包含块containing block

    <css权威指南>P167: The Containing Block Every element is laid out with respect to its containing b ...

  5. 恢复sudo的权限的命令

    出错的原因:不小心给了/etc/的所有文件的777属性,出现了sudo 的错误. 1.pkexec chmod 0440 /etc/sudoers 2.pkexec chmod 0440 /etc/s ...

  6. Android学习路线(二十)运用Fragment构建动态UI

    要在Android系统上创建一个动态或者多面板的用户界面,你须要将UI组件以及activity行为封装成模块.让它可以在你的activity中灵活地切换显示与隐藏. 你可以使用Fragment类来创建 ...

  7. spring 加载配置文件的相关配置总结

    PropertyPlaceholderConfigurer      注意: Spring容器仅允许最多定义一个PropertyPlaceholderConfigurer(或<context:p ...

  8. Linux中ssh的免密码登陆

    原理: Hadoop的各个节点要实时的进行各种通信的,ssh就是能让各个节点免密码的相互访问相互通信. 操作步骤: 这里用的加密方式是非对称的加密方式,具体的操作是: <1>执行命令ssh ...

  9. mysql 组合索引

    MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习. 为了形象地对比两者,再建一个表 ...

  10. hdu 3333 Turing Tree

    题目链接 给n个数, m个询问, 每次询问输出区间内的数的和, 相同的数只计算一次. 数组里的数是>-1e9 <1e9, 可以把它离散以后用莫队搞... #include <iost ...