在一个项目中,我们有几个SSIS包(大约200个),所有包名都存储在一个控制表中。我们需要创建一个可以运行所有200个包的主包。
由于最大并发可执行设置设置为8.因此计划在容器中创建8个执行包任务,并考虑使用存储在容器中的包名称动态生成连接字符串(执行包任务 - 文件连接字符串)表。
控制表格式如下
Id PackageName
---------------
1 Package1
2 Package2
关于如何实施的想法有帮助。
答案 0 :(得分:1)
我在https://stackoverflow.com/a/34868545/181965上介绍了这种模式,但您正在寻找一个看起来像这样的包
一个序列容器,包含这8个不连续的工作桶中的一个所需的所有内容。在您的情况下,
的变量containerId将是0到7的值(因为你有8个工作桶)。如其他答案中所述,我们必须将变量范围限定为Sequence Container。 2012+的默认设置是在控制流级别创建它们,而2005/2008将在所选对象的级别创建它们。
我创建了一个表并加载了200行
CREATE TABLE dbo.so_35415549
(
id int IDENTITY(1,1) NOT NULL
, PackageName sysname
);
INSERT INTO
dbo.so_35415549
(
PackageName
)
SELECT TOP 200
'Package' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS varchar(3))
FROM
sys.all_columns AS AC;
模数,模数,mod无论你怎么称它运算符都是我们的朋友。 mod运算符将在除法后返回余数。 例如 10 mod 3是1,因为3 * 3 + 1 = 10
在您的情况下,您将通过8 modding ,因此您知道余数将在0到7之间。
SQL Server将mod运算符实现为%
,您可以通过以下查询测试正确性
SELECT
S.id
, S.PackageName
, S.id % 8 AS ModValue
FROM
dbo.so_35415549 AS S
ORDER BY
1;
示例输出
id PackageName ModValue
1 Package1 1
2 Package2 2
3 Package3 3
4 Package4 4
5 Package5 5
6 Package6 6
7 Package7 7
8 Package8 0
9 Package9 1
10 Package10 2
...
199 Package199 7
200 Package200 0
使用上述查询作为模板,我们将使用以下查询。注意那里的?
。这是OLE DB连接管理器的执行SQL任务参数化的占位符。
SELECT
S.PackageName
FROM
dbo.so_35415549 AS S
WHERE
S.id % 8 = ?
ORDER BY
1;
我们传入的参数将是@ [User :: ContainerId]
结果集选项将从None更新为Full ResultSet,我们将值推送到rsObject
这是标准shredding of a recordset。我们在上一步中填充了变量,所以让我们通过结果进行枚举。我们的结果集中将有一列,您将其映射到User :: CurrentPackageName
这是您的执行包任务。使用CurrentPackageName的值并进行设置。