介绍
在本文中,我们会实验 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/
项目文件: