为 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 的值即可设置。