我正在处理具有以下逻辑的 T-SQL 脚本:
declare @tbl table(id int)
insert @tbl select distinct id -- <-- this takes about 3 minutes
from link1.some_table
where <some_conditions>
insert some_local_table(field1, field2, fieldN) -- <-- this takes about 30 minutes
select field1, field2, fieldN
from link2.some_table
where id in (select id from @tbl)
and <some conditions>
insert some_OTHER_local_table(field1, field2, fieldN) -- <-- another 30 minutes
select field1, field2, fieldN
from link2.some_OTHER_table
where id in (select id from @tbl)
and <some conditions>
insert some_YET_OTHER_local_table(field1, field2, fieldN) -- <-- another 30m, and so on
select field1, field2, fieldN
from link2.some_YET_OTHER_table
where id in (select id from @tbl)
and <some conditions>
...依此类推,有 5 个插入来自链接服务器 link2 的 5 个不同的本地表,但使用来自链接服务器 link1 的 @tbl 过滤。
填充每个本地表大约需要 30 分钟,因此整个脚本需要大约 2.5 小时。
我正在尝试并行化此过程,因此我将 5 个插入中的每一个放入单独的 SSIS 任务中并同时执行它们。但是,我不知道如何在 SSIS 中的任务之间共享 @tbl 表变量。在脚本中,@tbl 只是一个变量。在 SSIS 中没有表变量。顺便提一句。该表包含大约 200K id 值,因此无法构建逗号分隔的字符串。
所以问题是:如何实现一个共享的、“一次性的”、包级别的记录集对象,该对象将从数据库查询中初始化,然后用于同一个包中的几个并行任务?
我在 SQL Server 2008 R2 上。