tl;博士;
删除您的子包的 HasFrontOrderDataFile。子包将无法自行运行,许多任务会发出警告和/或显示红色 X 表示它们已损坏,但当父包运行时,它们会工作。
设置
给定一个包含 4 个变量的父包: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);
}
执行打包任务
这将运行一个子包。我定义了一个文件连接管理器指向 Child.dtsx
FELC 分解父变量对象
这是标准的 ADO Recordset 枚举模式。我将从 ParentVariableObject 的 0 和 1 的序数位置检索值。
之后
这是回显 4 个变量的值的同一个脚本任务。
子包
我的子包被定义为
我在这里定义了两个变量:ChildVariable as int 和 ChildObjectVariable as object(未使用)。 ChildVariable 初始化为 -2。如果它翻转到 -1,那么我们就知道我们已经正确地提取了父值。
在包配置中,我已将 User::ParentVariableSimple 映射到 ChildVariable 的 Value 属性中。
SCR 回声
父包中使用的相同脚本任务。我将两个子变量都传递给它。
Scr 增加 10
这就是事情变得奇怪的地方;)
我传入两个ReadWriteVariables:User::ChildVariable,User::ParentVariableSimple
现在,您无法从那里的 UI 中选择 ParentVariableSimple,您必须正确键入该变量,因为它存在于父包中。其中,我的代码与上面类似。
foreach (var item in Dts.Variables)
{
item.Value = (int)item.Value + 10;
}
此时,我们正在修改父包中的值!
SQL 加载父变量
我将在此处通过查询创建一个内存数据集。假设 OLE DB 连接管理器,配置它
- ResultSet = 完整结果集
- SQL 语句 = 选择?作为 Col1, ? AS Col2;
参数映射
- User::ChildVariable - ParameterName 0
- User::ParentVariableSimple - ParameterName 1
结果集
- 结果名称 0 - 变量名称 - User::ParentVariableObject
结果
运行的输出如下所示。在 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.
最后的想法
这是一个黑客。它有效,是的。那些在你之后维护这个包裹的人会诅咒你的名字直到时间结束。一种更简洁的方法是......在子包中引发一个事件。将该运行的值记录到表中并让父级读出它。可能是别的东西,但这只是问题的技术答案。