如何动态运行SSIS包?

时间:2016-09-01 08:29:02

标签: sql-server ssis etl ssis-2012

我们有一个大型的MSSQL生产数据库(mdf appx.400gb),我有一个测试数据库。所有的表,索引,视图等都是相同的。我需要确保这两个数据库的表中的数据一致。所以我需要插入所有新行,并每晚将所有更新的行更新到生产中的测试数据库中。

我想出了使用SSIS包通过检查所有表中的更新行和新行来使数据保持一致的想法。我的SSIS流程是;

我在每个表格中都有SSIS包,因为; 有序;

  1. 我在表中获取时间戳值以获取最后1天的行而不是获取整个表。
  2. 我在制作
  3. 中获得了表格的行
  4. 然后我使用'Lookup'工具将此数据与测试数据库表数据进行比较。
  5. 然后我使用条件精灵来获得数据是新的还是更新的线索。
  6. 如果数据是新的,我将此数据插入目的地 5_2。如果数据已更新,则我更新目标表中的数据。
  7. enter image description here

    数据流位于图片中的MTRule和STBranch包中

    问题是,我重复为每个表创建所有这个单个流,并且我有超过300个这样的表。这需要数小时和数小时:(

    我要问的是什么;

    SSIS中有什么方法可以动态执行此操作吗?

    PS:每个表都有自己的列和PK值,但我的数据流架构总是相同的。 。 (下)

    enter image description here

4 个答案:

答案 0 :(得分:1)

您可以查看BiMLScript,它允许您根据元数据动态创建包。

答案 1 :(得分:0)

我认为实现这一目标的最佳方法是使用表达式。它们使您能够动态设置源和目标。 一种可能的解决方案可能如下:

  • 创建一个存储所有表名和PK列的表
  • 定义一个包,该包循环通过此表并解析SQL语句
  • 调用您的主程序包并将stmt传递给它
  • 将stmt用作数据流的数据源
  • 如果适用,也将目标表作为参数传递(配置表中的另一列)

这就是我处理几个非常庞大的表的方法:数据必须从20个表中提取并移到一个表中。

答案 2 :(得分:0)

最好编写一个以tablename作为参数并在那里执行CRUD的存储过程。

然后在SSIS中的FOR EACH组件中调用存储过程。

答案 3 :(得分:0)

为什么需要使用SSIS?

最好编写一个以tablename作为参数并在那里执行CRUD的存储过程。然后在SSIS中的FOR EACH组件中调用存储过程。

实际上,您可以使用存储过程执行所有操作并在SQL代理作业中安排它。