我正在使用新的项目部署模型。
我有一个名为ETL的主包。我的ETL包的第一件事就是运行一个名为get SFTP文件的包,如图所示。
在获取SFTP文件中,foreach循环获取ClientID。我如何将此值传递回父包ETL ???要做插入等。
答案 0 :(得分:8)
这是一种将子包变量中的值传递给父包变量的方法。
脚本任务:(在子包中)
// 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中前缀为不。
答案 1 :(得分:4)
简单解决方案
在主程序包中添加变量(需要在主程序中使用)
将子程序包中的值分配给主程序包变量(对于主程序包变量,子程序中的访问没有问题)
一旦Control回到Master使用它们......并且因为它们是在Master Package中声明的,你可以使用它们在Child Packages下被赋予的值
答案 2 :(得分:3)
我和几位专家谈过这个问题,SSIS中没有这样做的实际方法。我确实看到了一个关于这样做的方法的提及,这实际上是一个脚本任务的黑客攻击,但是任何阅读这个商店的人都会将你的变量转化为表格和引用。执行包任务上的参数绑定目前是单向路径父 - >子。
答案 3 :(得分:2)
我仍在努力将先前版本的SSIS包迁移到SSIS 2012中,因此此处提供的信息可能不适用于2012版。
在以前的版本中,我们发现子包在运行时具有可见性(并且可以更改)父包中的SSIS变量值,这些值在子包的范围内(通常是父包的全局变量)。 / p>
这是通过使用子包在运行时需要更改的父包变量的相同名称将子包开发为独立包来完成的。
当Child Package完全开发并作为独立测试并在部署之前,应该从Child Package中删除具有相同名称的Parent Package变量的变量,并将Child Package的Delay Validation属性设置为true在部署时避免验证错误。
在运行时,当父包调用(或运行)子包时,实际上子包成为父包的组件,因此可以在子包的范围内引用和更改父包中的变量
希望这听起来不会令人困惑:)
答案 4 :(得分:0)
执行此操作的最佳方法是将您的子包和父包包含在同一项目中,并使用项目变量传递给子包。您可以调用或更改子包中的值,该值也可以在父包中使用。