为 SSIS 中的多个包动态生成文件连接
Dynamically Generate file connection for several packages in SSIS
在一个项目中我们有几个SSIS包(大约200个),所有的包名都存储在一个控件中table。我们需要创建一个主包,它可以 运行 所有 200 个包。
由于max concurrent executable设置为8。所以计划在容器中创建8个执行包任务,并考虑动态生成连接字符串(执行包任务-文件连接字符串)使用存储在 table 中的包名称。
控件table格式如下
Id PackageName
---------------
1 Package1
2 Package2
关于如何实施的想法很有帮助。
我在 上介绍了这种模式,但您正在寻找看起来像这样的包裹
一个序列容器,其中包含这 8 个离散工作桶中的一个所需的一切。在你的例子中,变量为
- 当前包字符串
- rsObject 对象
- ContainerId Int32
containerId 的值为 0 到 7(因为您有 8 个工作桶)。正如另一个答案中所述,我们必须将变量范围限定在序列容器中。 2012+ 中的默认设置是在控制流级别创建它们,而 2005/2008 将在所选对象级别创建它们。
设置
我创建了一个 table 并加载了 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;
获取我的存储桶的数据
modulus、modulo、mod 不管你怎么称呼它的运算符都是我们的朋友。 mod 运算符将 return 除法后的余数。 例如 10 mod 3 是 1 因为 3*3 + 1 = 10
在你的情况下,你将 modding 通过 8 所以你知道余数将在 0 和 7 之间。
SQL服务器实现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
SQL 获取工作列表
以上述查询为模板,我们将使用以下查询。注意那里的 ?
。这是 OLE DB 连接管理器的执行 SQL 任务参数化的占位符。
SELECT
S.PackageName
FROM
dbo.so_35415549 AS S
WHERE
S.id % 8 = ?
ORDER BY
1;
我们传入的参数将是@[User::ContainerId]
结果集选项将从 None 更新为完整结果集,我们将值推入 rsObject
FELC 粉碎工作清单
这是一个标准 shredding of a recordset。我们在上一步中填充了变量,所以让我们枚举结果。我们的结果集中会有一列,您将把它映射到 User::CurrentPackageName
EPT 运行 套餐
这是您的执行包任务。使用 CurrentPackageName 的值即可设置。
在一个项目中我们有几个SSIS包(大约200个),所有的包名都存储在一个控件中table。我们需要创建一个主包,它可以 运行 所有 200 个包。
由于max concurrent executable设置为8。所以计划在容器中创建8个执行包任务,并考虑动态生成连接字符串(执行包任务-文件连接字符串)使用存储在 table 中的包名称。
控件table格式如下
Id PackageName
---------------
1 Package1
2 Package2
关于如何实施的想法很有帮助。
我在 上介绍了这种模式,但您正在寻找看起来像这样的包裹
一个序列容器,其中包含这 8 个离散工作桶中的一个所需的一切。在你的例子中,变量为
- 当前包字符串
- rsObject 对象
- ContainerId Int32
containerId 的值为 0 到 7(因为您有 8 个工作桶)。正如另一个答案中所述,我们必须将变量范围限定在序列容器中。 2012+ 中的默认设置是在控制流级别创建它们,而 2005/2008 将在所选对象级别创建它们。
设置
我创建了一个 table 并加载了 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;
获取我的存储桶的数据
modulus、modulo、mod 不管你怎么称呼它的运算符都是我们的朋友。 mod 运算符将 return 除法后的余数。 例如 10 mod 3 是 1 因为 3*3 + 1 = 10
在你的情况下,你将 modding 通过 8 所以你知道余数将在 0 和 7 之间。
SQL服务器实现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
SQL 获取工作列表
以上述查询为模板,我们将使用以下查询。注意那里的 ?
。这是 OLE DB 连接管理器的执行 SQL 任务参数化的占位符。
SELECT
S.PackageName
FROM
dbo.so_35415549 AS S
WHERE
S.id % 8 = ?
ORDER BY
1;
我们传入的参数将是@[User::ContainerId]
结果集选项将从 None 更新为完整结果集,我们将值推入 rsObject
FELC 粉碎工作清单
这是一个标准 shredding of a recordset。我们在上一步中填充了变量,所以让我们枚举结果。我们的结果集中会有一列,您将把它映射到 User::CurrentPackageName
EPT 运行 套餐
这是您的执行包任务。使用 CurrentPackageName 的值即可设置。