我正在处理一个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。
答案 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项目提出,但它似乎不会很快出现。
据我所知,你还有另外两个选择:
X
ForEach循环任务,让他们处理它们之间的@n%X
任务。显然,这意味着您只能获得与您创建的任务数量相同的并行度。不是你想要的答案,但是这些是我现阶段可以想到的所有选择!
抱歉,我知道这不是最好的解释,所以如果有什么不清楚的话,请在评论中询问您想要的任何内容,我会尝试改进我的答案!