使用 SQL 查询禁用 SSIS 中的序列容器?

Disable a sequence container in SSIS using SQL query?

假设我有一个 SSIS 包,它有将近 20 个序列容器,在 运行 完成作业时,一些序列容器成功完成,但有一些失败。所以,在这里我想要一个自动 SQL 查询来禁用已完成的序列容器并启用失败的序列容器,这样如果我再次 运行 包,那么它将 运行 只有失败的序列容器.

是否有机会禁用已完成的序列容器和 运行 失败的序列容器?

您可以使用 SSIS 中的 CHECKPOINT 文件功能自动 运行 仅控制流任务中失败的容器。它在 SSIS 中开箱即用。可以在包里配置。

Read more on Checkpoint usage & Restart packages using checkpoint on MSDN

就我个人而言,我讨厌检查站。它们不能在循环的上下文中工作,也许这只是我的运气不好,但我经常遇到检查点文件损坏的情况

我总是建议客户在设计 ETL 解决方案时考虑到可重启性。在某些时候,该过程将失败,并且您知道它将处于关键的中间,因此删除重新启动它的 "thinking" 方面。不要让它依赖于某人运行宁一个脚本来清理一半提交的负载等。但这是一个不同的问题...

控制流中的每个对象都将支持名为 Disable 的 属性。当你 运行 一个包时,你可以通过 /SET 命令停用任务。在下面的示例中,每个序列容器都有一个脚本任务,它只执行 fires an information event

当我从命令行 运行 时,

C:\Users\bfellows\source\repos\SO_Trash\SO_Trash>dtexec /file SO_61477591.dtsx /rep i
Microsoft (R) SQL Server Execute Package Utility
Version 14.0.3238.1 for 32-bit
Copyright (C) 2017 Microsoft. All rights reserved.

Started:  10:45:43 AM
Info: 2020-04-28 10:45:43.71
   Code: 0x00000000
   Source: SCR0 SCR Echo Back
   Description: System::ParentContainerGUID : {3910E325-F3D0-4EC6-96FD-5E125FEC0ED2}
End Info
Info: 2020-04-28 10:45:43.74
   Code: 0x00000000
   Source: SCR1 SCR Echo Back
   Description: System::ParentContainerGUID : {08bf88d5-71c3-4105-824e-bb8b1e942b24}
End Info
Info: 2020-04-28 10:45:43.77
   Code: 0x00000000
   Source: SCR2 SCR Echo Back
   Description: System::ParentContainerGUID : {59823604-1caf-4a90-9303-45d55126d8b3}
End Info
Info: 2020-04-28 10:45:43.80
   Code: 0x00000000
   Source: SCR3 SCR Echo Back
   Description: System::ParentContainerGUID : {977567f1-6bcf-4c84-909e-eb18ba17165d}
End Info
DTExec: The package execution returned DTSER_SUCCESS (0).
Started:  10:45:43 AM
Finished: 10:45:43 AM
Elapsed:  0.609 seconds

通过指定 executable 的路径,我可以像 /set \Package\SEQC1.Properties[Disable];"True" 一样设置 属性 禁用 属性,其中 SEQC1 是对象的区分大小写的名称 I想要禁用

C:\Users\bfellows\source\repos\SO_Trash\SO_Trash>dtexec /file .\SO_61477591.dtsx /rep i /set \Package\SEQC1.Properties[Disable];"True"
Microsoft (R) SQL Server Execute Package Utility
Version 14.0.3238.1 for 32-bit
Copyright (C) 2017 Microsoft. All rights reserved.

Started:  10:45:50 AM
Info: 2020-04-28 10:45:50.62
   Code: 0x00000000
   Source: SCR0 SCR Echo Back
   Description: System::ParentContainerGUID : {3910E325-F3D0-4EC6-96FD-5E125FEC0ED2}
End Info
Info: 2020-04-28 10:45:50.66
   Code: 0x00000000
   Source: SCR2 SCR Echo Back
   Description: System::ParentContainerGUID : {59823604-1caf-4a90-9303-45d55126d8b3}
End Info
Info: 2020-04-28 10:45:50.69
   Code: 0x00000000
   Source: SCR3 SCR Echo Back
   Description: System::ParentContainerGUID : {977567f1-6bcf-4c84-909e-eb18ba17165d}
End Info
DTExec: The package execution returned DTSER_SUCCESS (0).
Started:  10:45:50 AM
Finished: 10:45:50 AM
Elapsed:  0.609 seconds

请注意,由于 SET 命令将其禁用,SCR1 不再出现在输出中。

知道如何禁用任务,您可以按原样保留包并将开始修改为从 SQL 查询生成的文本(给我所有已完成的任务并构建正确的 /SET 语句)

需要修改现有包的更好方法是在包的开头执行 SQL 任务 运行s 并将布尔 SSIS 变量设置为是否应禁用任务的指示器。然后修改每个对象,使其在禁用 属性 上有一个表达式,即新的 SSIS 变量。

就我个人而言,我的方法是制作许多 SSIS 包。每个包都是一个工作单元(load sales table)。当包触发时,它记录执行已经开始。当它成功完成时,它记录它已经完成(以及有多少行inserted/updated/deleted)

然后我有一个协调程序包,它查询已知包的列表并识别任何未 运行 成功的包。然后它使用带有执行包任务的 foreach 循环来启动 运行 子进程。

我的方法的一个优点是,假设任务 1 和任务 3 之间没有依赖关系,我可以拥有这个 运行ning 的两个副本 - 一个 "stack" 处理包 0 和 2,而不同的堆栈处理 1 和 3。SSIS 的优势之一是它可以轻松并行化您的工作负载。