【问题标题】:Dynamically Generate file connection for several packages in SSIS为 SSIS 中的几个包动态生成文件连接
【发布时间】:2016-02-16 10:20:13
【问题描述】:

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

由于 max concurrent executable 设置为 8。所以计划在一个容器中创建 8 个执行包任务,并考虑使用存储在容器中的包名称动态生成连接字符串(执行包任务-文件连接字符串)桌子。

控制表格式如下

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

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

【问题讨论】:

    标签: sql ssis ssis-2012


    【解决方案1】:

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

    一个序列容器,其中包含这 8 个离散工作桶之一所需的所有内容。在你的情况下,一个变量为

    • 当前包字符串
    • rsObject 对象
    • ContainerId Int32

    containerId 将是 0 到 7 之间的值(因为您有 8 个工作桶)。如另一个答案中所述,我们必须将变量范围限定为序列容器。 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 运算符将返回除法后的余数。 例如 10 mod 3 是 1 因为 3*3 + 1 = 10

    在您的情况下,您将通过 8 修改,因此您知道余数将在 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]

    结果集选项将从无更新为完整结果集,我们将值推送到rsObject

    FELC 粉碎工作清单

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

    EPT 运行包

    这是您的执行包任务。使用 CurrentPackageName 的值就可以了。

    【讨论】:

    • 感谢您提供帮助的详细解释以及实施它的好主意
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多