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

时间:2015-03-11 15:57:31

标签: sql-server sql-server-2008 parameters ssis parallel-processing

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

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

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

我该如何处理?我在想一个FOR循环,但你不能在SSIS中获得异步FOR循环,所以这不会起作用。还有其他想法吗?

我使用的是SQL Server 2008 R2。

2 个答案:

答案 0 :(得分:1)

我可能会用脚本组件来做这件事。

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

SqlCommand.BeginExecuteNonQuery

是异步的(即,它立即返回)。

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

答案 1 :(得分:0)

在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)作为Connect项目提出,但它似乎不会很快出现。

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

  1. 在SSIS中创建X ForEach循环任务,让他们处理它们之间的@n%X任务。显然,这意味着您只能获得与您创建的任务数量相同的并行度。
  2. 推出自己的托管代码解决方案,可以生成自己的主题。
  3. 不是你想要的答案,但是这些是我现阶段可以想到的所有选择!


    抱歉,我知道这不是最好的解释,所以如果有什么不清楚的话,请在评论中询问您想要的任何内容,我会尝试改进我的答案!