Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS 2012使用项目部署模型将值从子包传递到父包_Ssis - Fatal编程技术网

SSIS 2012使用项目部署模型将值从子包传递到父包

SSIS 2012使用项目部署模型将值从子包传递到父包,ssis,Ssis,我正在使用新的项目部署模型 我有一个名为ETL的主包。我的ETL包做的第一件事就是运行一个名为get SFTP files的包,如图所示 在Get SFTP文件中,foreach循环获取ClientID。如何将此值传递回父包ETL???做插页等 我与几位专家讨论过这一点,在SSIS中没有本地方法可以做到这一点。我确实看到有人提到这样做的一种方法,它实际上是对脚本任务的一种攻击,但是任何阅读此存储的人都会将变量的结果放入一个表中并从中引用。执行包任务上的参数绑定当前是单向父-->子项。我仍在将S

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

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

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


我与几位专家讨论过这一点,在SSIS中没有本地方法可以做到这一点。我确实看到有人提到这样做的一种方法,它实际上是对脚本任务的一种攻击,但是任何阅读此存储的人都会将变量的结果放入一个表中并从中引用。执行包任务上的参数绑定当前是单向父-->子项。

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

在以前的版本中,我们发现子包在父包中具有可见性(并且可以更改)SSIS变量值,这些值在运行时位于子包的作用域(通常是父包的全局变量)中

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

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

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


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

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

脚本任务:(在子包中)

这段代码实际上来自一个2012年以前的SSIS包,我刚刚完成了到SSIS for SQL Server 2012(在Visual Studio 2012中)的升级,并转换为项目部署模型


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

简单的解决方案是

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

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


一旦控制返回给主控,就会使用它们……因为它们是在主控包中声明的,所以可以使用它们在子包下分配的值,最好的方法是将子包和父包包含在同一个项目中,并使用项目变量传递给子包。您可以调用或更改子包中的值,并且该值也可以在父包中使用。

如果是foreach循环,它是只返回一个值还是希望返回一个ID流?嗨,billin,谢谢您的回答。我希望得到一个值。例如,我想为客户/公司表中的每个客户/公司执行一个数据流。billin,您能否提供一个简单的示例,说明如何在子包中输出变量以覆盖父包中的值?谢谢。根据我所能发现的,在2012年,将数据从一个包传递到另一个包的新方法是单向的。我还没有尝试过父子参数的“经典”方法(显式配置或变量封装),但它们可能仍然有效。我对这一点相当陌生,我基本上是在学习ssis 2012。。。给人的印象是,将变量从父级传递到子级很容易,即在执行sql任务时进行参数绑定,但不确定如何以相反的方式执行。。。子-->父级…非常好的解释解决方案。第一个
Dts.variablepender.GetVariables(ref-vars)不是必需的。它不必写两次。@Zach Blocker。这个解决方案也适用于2015版吗?我不知道-仍然使用2012来维护我们的软件包。把你发现的发回来。真遗憾:(…但是你的帖子已经过时了。有人知道这方面有什么消息吗?谢谢你,这个答案帮助了我。但是,第一次阅读时不容易理解。无论如何,谢谢。
// 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();