[英]SSIS - How to set parent variable value from child package using Package Deployment Model
删除您的子包的 HasFrontOrderDataFile。 子 package 将无法自行运行,许多任务会发出警告和/或显示红色 X 表示它们已损坏,但当父运行时,它们会工作。
给定具有 4 个变量的父 package:Col1、Col2、ParentVariableSimple 全部为 Int32 和 ParentVariableObject
这是一个仅回显变量值的执行脚本任务。 将所有 4 个添加为此任务的只读变量
bool fireAgain = false;
string message = "{0}::{1} : {2}";
foreach (var item in Dts.Variables)
{
Dts.Events.FireInformation(0, "SCR Echo Back", string.Format(message, item.Namespace, item.Name, item.Value), string.Empty, 0, ref fireAgain);
}
这将运行一个子 package。 我定义了一个文件连接管理器指向 Child.dtsx
这是标准的 ADO Recordset 枚举模式。 我将从 ParentVariableObject 的 0 和 1 的序数 position 中检索值。
这是回显 4 个变量的值的相同脚本任务。
我的孩子 package 被定义为
我在这里定义了两个变量:作为 int 的 ChildVariable 和作为 object 的 ChildObjectVariable(并且未使用)。 ChildVariable 初始化为 -2。 如果它翻转到 -1,那么我们知道我们已经正确地提取了父值。
在 Package 配置中,我已将 User::ParentVariableSimple 映射到 ChildVariable 的 Value 属性中。
父 package 中使用的相同脚本任务。 我将两个子变量都传递给它。
这是 go 奇怪的地方;)
我传入两个 ReadWriteVariables:User::ChildVariable,User::ParentVariableSimple
现在,您不能从那里的 UI 中使用 select ParentVariableSimple,您必须正确键入变量,因为它存在于父 package 中。 在里面,我的代码与上面类似。
foreach (var item in Dts.Variables)
{
item.Value = (int)item.Value + 10;
}
此时,我们正在修改父包中的值!
我将在这里通过查询创建一个 memory 数据集。 假设 OLE DB 连接管理器,配置它
参数映射
结果集
运行的output如下图所示。 在 FELC 中,Col1 将是子变量的值,Col2 将是父变量的修改值,这也很方便地回显。
SSIS package "C:\Users\bfellows\source\repos\PackageDeploymentModel\PackageDeploymentModel\Parent.dtsx" starting.
Information: 0x0 at Before, SCR Echo Back: User::Col1 : 0
Information: 0x0 at Before, SCR Echo Back: User::Col2 : 0
Information: 0x0 at Before, SCR Echo Back: User::ParentVariableObject : System.Object
Information: 0x0 at Before, SCR Echo Back: User::ParentVariableSimple : -1
Executing ExecutePackageTask: C:\Users\bfellows\source\repos\PackageDeploymentModel\PackageDeploymentModel\Child.dtsx
Information: 0x40016042 at Child: The package is attempting to configure from the parent variable "User::ParentVariableSimple".
Information: 0x40016042 at Child: The package is attempting to configure from the parent variable "User::ParentVariableSimple".
Information: 0x0 at SCR Echo, SCR Echo Back: User::ChildObjectVariable : System.Object
Information: 0x0 at SCR Echo, SCR Echo Back: User::ChildVariable : -1
Information: 0x0 at After, SCR Echo Back: User::Col1 : 9
Information: 0x0 at After, SCR Echo Back: User::Col2 : 9
Information: 0x0 at After, SCR Echo Back: User::ParentVariableObject : System.__ComObject
Information: 0x0 at After, SCR Echo Back: User::ParentVariableSimple : 9
SSIS package "C:\Users\bfellows\source\repos\PackageDeploymentModel\PackageDeploymentModel\Parent.dtsx" finished: Success.
这是一个黑客。 它有效,是的。 那些在你之后维护这个 package 的人会诅咒你的名字直到时间结束。 一种更简洁的方法是……在子 package 中引发一个事件。 将该运行的值记录到表中并让父级读出它。 可能是别的东西,但这只是问题的技术答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.