动态生成SSIS中多个包的文件连接

时间:2016-02-15 17:33:27

标签: sql ssis ssis-2012

在一个项目中,我们有几个SSIS包(大约200个),所有包名都存储在一个控制表中。我们需要创建一个可以运行所有200个包的主包。

由于最大并发可执行设置设置为8.因此计划在容器中创建8个执行包任务,并考虑使用存储在容器中的包名称动态生成连接字符串(执行包任务 - 文件连接字符串)表。

控制表格式如下

Id PackageName
---------------
1  Package1
2  Package2

关于如何实施的想法有帮助。

1 个答案:

答案 0 :(得分:1)

我在https://stackoverflow.com/a/34868545/181965上介绍了这种模式,但您正在寻找一个看起来像这样的包

enter image description here

一个序列容器,包含这8个不连续的工作桶中的一个所需的所有内容。在您的情况下,

的变量
  • CurrentPackage String
  • rsObject对象
  • ContainerId Int32

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

SQL获取工作列表

使用上述查询作为模板,我们将使用以下查询。注意那里的?。这是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

FELC Shred Work List

这是标准shredding of a recordset。我们在上一步中填充了变量,所以让我们通过结果进行枚举。我们的结果集中将有一列,您将其映射到User :: CurrentPackageName

EPT Run Package

这是您的执行包任务。使用CurrentPackageName的值并进行设置。