SSIS 2012 - 将变量从父包传递到子包

时间:2014-08-04 16:39:39

标签: sql ssis ssis-2012

我知道这个话题已被多次讨论,但我有一点需要注意,我似乎无法找到答案。

我有几个包都有ActivityDate变量。默认情况下,软件包需要在昨天的日期运行。

有两种可能的情况。

场景1 - 从主包调用包。在这种情况下,ActivityDate在主程序包中设置一次,到昨天的日期,然后传递给子程序包。

场景2 - 程序包独立运行。在这种情况下,ActivityDate在每个子包中设置,也通过表达式设置在昨天的日期。

在SQL 2008中,它非常简单 - 每个子包中的变量通过方案1的包配置设置,但在方案2中运行时使用表达式。

我不清楚如何在2012年完成此任务。没有更多的软件包配置,因此我需要在子软件包中创建package参数,然后从父级链接到它。但参数不使用表达式。因此,如果我在子包中创建ActivityDate参数,那么我可以从父级链接到它(对于场景1),但是我不能为它创建表达式(对于场景2)。如果我只有ActivityDate变量,那么我可以创建一个表达式,但不能从父级链接到它。
那么我如何让这两个场景在2012年运作?

请帮助!

1 个答案:

答案 0 :(得分:9)

首先,参数绑定可以使用表达式:

  1. 创建一个变量@User :: Variable来保存您想要传递给子包的值。
  2. 将@User :: Variable绑定到您的子参数。
  3. 其次,代替包配置,您具有执行相同基本功能的环境变量,在运行时动态设置参数值。基本设置是:

    1. 定义项目参数并在包中使用。
    2. 在IS服务器上,定义环境,设置环境变量。
    3. 部署项目并将环境变量绑定到项目参数。
    4. 使用特定的环境参考执行包。
    5. 无论如何,它并不完全清楚你想要完成什么 - 默认情况下使用父活动日期,但是允许使用参数覆盖它?或者,如果您独立于父母调用子包,仍然提供昨天的值?

      所以,我认为这可以实现你想要的东西:

      1. 在Master Package User :: ActivityDate中创建变量。直接设置其值或使用表达式。
      2. 在Master Package User :: RunningFromMaster中创建第二个变量。设置为类型布尔值并将默认值设置为True。
      3. 在执行包任务中绑定到User :: ActivityDate的Child Package $ Parameter :: MasterActivityDate中创建参数。
      4. 在“执行包”任务中绑定到User :: RunningFromMaster的Child Package $ Parameter :: RunningFromMaster中创建参数。设置为类型布尔值,默认为False。
      5. 在Child Package User :: ChildActivityDate中创建变量。
      6. 将User :: ChildActivityDate的Expression属性设置为(@[$Parameter::RunningFromMaster] ? @$Parameter::MasterActivityDate : DATEADD("d",-1, GETDATE() ) )
      7. 在您的包中使用User :: ChildActivityDate。
      8. 当您从master运行时,User :: ChildActivityDate将只传递传递给MasterActivityDate参数的任何值。当您的子包独立运行时,它只会使用表达式来提取昨天的日期(随意修改表达式以满足您的特定需求。)

        此外,如果有人问,我使用了布尔值,因为DateTime参数总是默认为GETDATE(),因此您必须构建复杂的条件以确定它们是否已设置。