SSIS - 执行同一任务的 N 个并发实例

SSIS - execute N concurrent instances of the same task

我目前正在处理一个 SSIS 包。它所做的是将完全相同的 SQL 语句运行 10 次,每次使用不同的参数 N 值(N 从 0 到 9)。语句彼此独立(它们只是 INSERT INTO ... SELECT * FROM ... WHERE some_int_column % 10 = N)。

我当前的实现非常幼稚:我创建了 10 个相同的 .sql 文件副本,其中包含 10 个不同的 N 值,然后创建了 10 个单独的 "Execute SQL" 任务并将每个任务指向不同的SQL 个文件。

这很好用。但现在我需要能够动态更改 N 的最大值,即创建 Nmax 并行任务,每个任务具有不同的参数值(从 0 到 Nmax-1)。

我应该如何处理这个问题?我在考虑一个 FOR 循环,但你不能在 SSIS 中获得一个异步 FOR 循环,所以这是行不通的。还有其他想法吗?

我正在使用 SQL Server 2008 R2。

在SQL中,我们竭尽所能避免循环。

我们成套思考。

假设您现有的过程如下所示:

ALTER PROCEDURE some_procedure (
   @n int
)
  AS
BEGIN
  SET NOCOUNT ON;

  INSERT INTO something (column_list)
  SELECT column_list
  FROM   something_else
  WHERE  some_int_column % 10 = @n
  ;
END
;

这里有一个很小的变化,看看你能不能发现!

ALTER PROCEDURE some_procedure (
   @n int
)
  AS
BEGIN
  SET NOCOUNT ON;

  INSERT INTO something (column_list)
  SELECT column_list
  FROM   something_else
  WHERE  some_int_column % 10 <= @n
  ;
END
;

你看到了吗? = @n变成了<= @n

考虑到您想要为 @n=0@n=3 执行此操作。在第一个过程中我们会做:

EXEC some_procedure @n=0;
EXEC some_procedure @n=1;
EXEC some_procedure @n=2;
EXEC some_procedure @n=3;

但是随着更新,我们可以做到:

EXEC some_procedure @n=3;

关于并行度的更新:

遗憾的是,SSIS 当前不在 ForEach 循环中包含此类功能。这在过去已作为连接项目提出 (https://connect.microsoft.com/SQLServer/feedback/details/544304/ssis-parallel-foreach-loop),但它看起来不会很快出现。

据我所知,您还有另外两个选择:

  1. 在 SSIS 中创建 X ForEach 循环任务并让它们处理它们之间的 @n%X 任务。显然,这意味着您只能获得与您创建的任务数量一样多的并行度。
  2. 推出您自己的托管代码解决方案,可以产生自己的线程。

不是你要找的答案,但你是我现阶段能想到的所有选择!


抱歉,我知道这不是最好的解释,所以如果有什么不清楚的地方,请在评论中提出任何问题,我会尽力改进我的答案!

我可能会使用脚本组件来完成此操作。

它将包含一个从 1 到 N 的循环 并致电

SqlCommand.BeginExecuteNonQuery

这是异步的(即,它 returns 立即)。

这将提供您需要的并行性。