SSIS学习使用七:中级SSIS工作流管理

1,204 阅读5分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

翻译参考

本文主要参考翻译自 the Stairway to Integration Services 系列文章的 Intermediate SSIS Workflow Management – Level 7 of the Stairway to Integration Services,目的在于对 SSIS 有一个全面清晰的认识,所有内容在原文的基础上进行实操,由于版本差异、个人疑问等多种原因,未采用完全翻译的原则,同时也会对文中内容进行适当修改,希望最终可以更有利于学习和了解 SSIS,

感谢支持!

中级SSIS工作流管理

在上一部分,我们构建一个新的 SSIS包,查看了 SSIS 中的脚本任务和优先约束,并检查了 MaxConcurrentExecutables 包属性。

本篇中,我们将检查、演示和测试优先约束的 “On Success”、“On Completion” 和 “On Failure” 功能。

约束评估(Constraint Evaluation)

在上一部分中有提到"优先约束评估"。它决定了"终止任务"的开始执行。而评估的类型分为以下几类。

On Success

优先约束评估的默认类型为"On Success"。

为了演示,在 Visual Studio 中运行 Precedence包。如下,首先,一个来自 "Script Task 1" 的消息框出现:

当点击消息框的确定按钮,"Script Task 1" 成功(右上角的绿色对勾表示成功),"Script Task 1" 和 "Script Task 2" 之间的评估为True,然后 "Script Task 2" 执行并显示如下消息框

点击 "Script Task 2" 消息框的“确定”按钮,"Precedence.dtsx"包 完成并成功。

此处的优先级约束配置为 "On Success" 评估。

停止包的运行。

On Completion (Success)

右击优先约束,查看右键菜单中可用的 "配置选项"(configuration options)。可以发现"编辑..."后面有 成功(Success)、失败(Failure) 和 完成(Completion)。

点击"完成",优先约束的颜色会从绿色转换(深)蓝色(不同的版本颜色似乎有差异,原本成功的颜色是纯正的绿色,现在已经偏蓝绿色。原本完成是蓝色,现在是特别深的深蓝色,趋近于黑色了)。

现在 “Script Task 1” 和 “Script Task 2” 之间的优先约束配置为评估" On Completion"。“Script Task 1”无论成功还是失败,只要完成执行优先约束就会评估,且“Script Task 2”将执行。

调试运行 SSIS包,一旦 “Script Task 1” 执行成功,“Script Task 2” 将执行。

停止包的运行。

你可能会有疑问:“此处仅仅测试了'On Completion'配置的成功时的优先约束;我们如何知道在失败时起作用?”,答案是:“这种情况下,我们不知道'On Completion'配置在失败时的条件”。

下面测试失败时(On Failure)执行。

On Completion (Failure)

首先,我们生成一个失败的条件。

打开 "Script Task 1" 编辑器,点击"编辑脚本"。在Main()函数中加入对消息框返回的判断,根据判断结果返回 "脚本任务"('Script Task') 是成功(点击yes按钮时)还是失败(不点击yes按钮时)。

public void Main()
{
    // TODO: Add your code here
    var sTaskName = Dts.Variables["TaskName"].Value.ToString();
    var boxRes = MessageBox.Show(sTaskName + " Succeed?", "确认", MessageBoxButtons.YesNo);
    if (boxRes == DialogResult.Yes)
    {
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    else
    {
        Dts.TaskResult = (int)ScriptResults.Failure;
    }
}

关闭脚本代码编辑器,并点"确定"关闭脚本任务编辑器。

执行SSIS包,将会出现如下消息框,点击 "是"(Yes) 按钮,"On Completion"优先约束 将会评估且 "Script Task 2" 将执行。这就是我们之前演示的用例。

如果点击 "否"(No)按钮,"Script Task 2"也将执行。

注:此时在修改完 "Script Task 1" 的脚本后,你会发现 "Script Task 2" 脚本的执行,出现的消息也跟着改变了。点进去编辑脚本查看,代码是没问题的。

解决办法:在 "Script Task 2" 的编辑脚本中随便出现个变动(如加个空格,加个回车换行等),并保存。再次执行将不会有此问题!

这个问题出现的原因是:我们复制并粘贴 "Script Task 1" 来创建 "Script Task 2"。有时,属于一个被复制的脚本任务的元数据,将导致来自一个脚本任务的代码在复制和粘贴的第二个脚本的上下文中执行。这种情况很少见,但是确实也发生了。

添加更改将使 SSIS 重新评估("re-evaluate")嵌入到 "Script Task 2" 中的脚本代码。从而按设计的代码执行。

我们知道了 "On Completion" 在上一个任务无论成功还是失败时都会执行。下面重新测试下"On Success"。

重新测试 On Success

右键“优先约束”,并设置为"成功"。

调试运行 SSIS,在 "Script Task 1" 消息框中点击 "否" 按钮,导致脚本任务失败。然后可以看到 "Script Task 2" 将不会执行。

如果发生异常或错误,我们使用 "On Success"优先约束 停止执行。

On Failure

停止当前的执行,右击 “优先约束” 并选择 "失败"(On Failure)。优先约束将会更改颜色为红色,标识它配置为 上一个任务在失败时评估并执行。

执行 SSIS 包,当 "Script Task 1" 出现提示框时,点击 "否" 按钮,"Script Task 2" 将会按如下执行。

可以重新运行,然后在 "Script Task 1" 的提示框中点击 "是","Script Task 1" 成功,但是 优先约束 不会评估,且 "Script Task 2" 不会执行。

停止当前的调试运行。

总结

本篇中,我们使用 SSIS 脚本任务完成测试多种用例的状态。使用测试状态演示 SSIS优先约束 如何表示上一个任务的成功、完成和失败条件。