在SQL表中有条件地循环并执行存储过程

时间:2015-03-07 06:23:19

标签: sql-server ssis

我目前有一个SQL Server表,由多个存储过程组成,每个存储过程都属于父节。例如:

ID为1001-1199的存储过程属于第1章 ID为1200-1299的存储过程属于第2章 ID为1300-1399的存储过程属于第3章 等...

在SSIS的上下文中,我为每个章节及其存储过程创建了一个ADO ForEachLoop容器(总共8章容器)。截至目前,意图是每个章节的循环将访问包含整个表的对象变量,并循环通过与该章对应的每个存储过程,然后使用执行SQL任务执行它。我想要做的是找出一种简单的方法,从对象变量中有条件地选择给定章节的存储过程并在继续下一章之前执行它们。

因此,例如,第1章的循环将从对象变量中的表中选择仅存储过程1001-1199并执行它们,然后继续下一章循环。

我想到了在章节之间的先例约束上使用表达式的想法,但如果我可以通过循环容器本身将条件/表达式应用于存储过程的集合,那么这似乎是理想的。

我对SSIS和SQL Server有点新,并且会感谢任何解决方案建议以及对我理解的解释。谢谢,麻烦您了。

1 个答案:

答案 0 :(得分:2)

我假设您已经在现有ProcID ProcName中映射了ForEachLoopVariableMappings的变量。唯一剩下的任务是在每个循环中过滤ProcID,以便仅处理与上下文章节关联的存储过程。这可以按如下方式完成。

1)为每个Sequence Container容器添加空ForEachLoop

2)将每个新Sequence ContainerPrecedence Constraint关联到每个ForEachLoop容器中的第一个(或唯一)任务

3)在第一个任务之前编辑每个Precedence Constraint以指定以下属性:

Evaluate Operation: Expression
Expression (different for each chapter): @[User::ProcID] >= 1001 && @[User::ProcID] <= 1199

以下是这些更改后的包控制流程示例:

Package control flow after changes

如果除了执行的存储过程之外,每章ForEach循环都是相同的,请考虑使用嵌套的ForEach循环进行重构(即ForEach Chapter和ForEach ChapterStoredProcedure)。 ForEach Chapter容器的第一个任务是加载上下文章节的procs集合,然后执行ForEach ChapterStoredProcedure容器。在使用此方法的内部ForEach ChapterStoredProcedure之前没有优先约束,因为枚举器将仅包含当前章节的proc。以下是此技术的一个示例。

Nested ForEach container example