【问题标题】:SSIS 2012 pass values from child package to parent with project deployment modelSSIS 2012 使用项目部署模型将值从子包传递到父包
【发布时间】:2013-11-29 15:14:22
【问题描述】:

我正在使用新的项目部署模型。

我有一个名为 ETL 的主包。我的 ETL 包做的第一件事是运行一个名为 get SFTP files 的包,如图所示。

在获取 SFTP 文件中,foreach 循环获取 ClientID。我如何将此值传递回父包 ETL ???做插入等。

【问题讨论】:

  • 如果它是一个 foreach 循环,它是只发回一个值还是您希望返回一个 id 流?
  • 嗨,比林,感谢您的回复。我会期待一个单一的价值。例如,我想为客户/公司表中的每个客户/公司执行数据流。
  • billin,您能否提供一个简短/简单的示例,说明如何在子包中输出变量以覆盖父包中的值?谢谢。
  • 据我所知,参数,将数据从一个包传递到另一个包的新方法是 2012 年的单向街道。我还没有尝试过任何一种“经典”的父方法子参数(显式配置或变量封装),但它们可能仍然有效
  • 对不起,我对此很陌生,我基本上是在 ssis 2012 中学习的......并且给人的印象是从父级向子级传递变量很容易,即执行 sql 任务上的参数绑定,但不是确定如何反其道而行之……孩子 --> 父母……

标签: ssis


【解决方案1】:

这是一种将值从子包变量传递到父包变量的方法。

脚本任务:(在子包中)

// Populate collection of variables.
// This will include parent package variables.
Variables vars = null;
Dts.VariableDispenser.GetVariables(ref vars);

// Lock the to and from variables. 
Dts.VariableDispenser.LockForWrite("User::MyParentPackageVar");
Dts.VariableDispenser.LockForRead("User::MyChildPackageVar");

// Apparently need to call GetVariables again after locking them.
// Not sure why - perhaps to get a clean post-lock set of values.
Dts.VariableDispenser.GetVariables(ref vars);
vars["User::MyParentPackageVar"].Value = vars["User::MyChildPackageVar"].Value;

vars.Unlock();

此代码实际上来自 2012 年之前的 SSIS 包,我刚刚完成升级到 SQL Server 2012 的 SSIS(在 Visual Studio 2012 中),并转换为项目部署模型。

最初,执行在变量赋值行上终止(经过长时间的延迟)。但后来我添加了“User::”前缀,这显然对至少一个变量是必需的,但不是我以这种方式分配的所有变量。在 SQL Server 2008 的 SSIS 中,前缀不需要

【讨论】:

  • 很好的解决方案和解释。你的脚本写得很好。
  • 第一个Dts.VariableDispenser.GetVariables(ref vars); 不是必需的。它不必写两次。
  • @Zach Blocker。此解决方案是否也适用于 2015 版本?
  • 我不知道 - 仍在使用 2012 来维护我们的软件包。发回您发现的内容。
【解决方案2】:

简单的解决方案是

在Master包中添加变量(需要在Master中使用)

将子包中的值分配给主包变量(在子包中访问主包变量没有问题)

一旦控制权返回到 Master 使用它们......并且因为它们是在 Master Package 中声明的,您可以使用它们在 Child Packages 下分配的值

【讨论】:

  • 谢谢你,这个答案帮助了我。但是,在第一次阅读时并不容易理解。无论如何,谢谢。
【解决方案3】:

我已经与几位专家讨论过这个问题,在 SSIS 中没有 NATIVE 方法可以做到这一点。我确实看到了有关执行此操作的方法的提及,这实际上是脚本任务中的一种黑客攻击,但是任何读取此存储的人都会从您的变量中得到一个表并从那里引用。执行包任务上的参数绑定目前是ONE way street Parent --> Child。

【讨论】:

  • 真可惜 :( ...但是你的帖子已经很旧了。有人知道这方面是否有任何消息吗?
【解决方案4】:

我仍在努力将 SSIS 包从以前的版本迁移到 SSIS 2012,因此此处提供的信息可能不适用于 2012 版本。

在以前的版本中,我们发现子包在运行时在父包的范围内(通常是父包的全局变量)具有可见性(并且可以更改)SSIS 变量值。

这是通过使用与子包在运行时需要更改的父包变量相同的名称将子包开发为独立包来完成的。

当子包完全开发并作为独立测试并部署之前,应从子包中删除与父包变量同名的变量,并将子包的延迟验证属性设置为true以避免在部署时出现验证错误。

在运行时,当父包调用(或运行)子包时,子包实际上成为父包的一个组件,因此可以在子包范围内引用和更改父包中的变量.

希望这听起来不会很混乱:)

【讨论】:

    【解决方案5】:

    最好的方法是将您的子包和父包包含在同一个项目中,并使用项目变量传递给子包。您可以调用或更改子包中的值,并且该值也将在父包中可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多