SSIS - 如何使用包部署模型从子包设置父变量值

SSIS - How to set parent variable value from child package using Package Deployment Model


我试图将子变量值传递给父变量但无法使其工作。我使用的是包部署模型而不是项目部署模型。

Parent 和 Child 中的变量具有完全相同的名称。我使用包配置在子包中引用了父变量。

然后我在子脚本任务中设置值:

值设置正确(从0到1):

但是回到parent,值还是0(应该是1):

由于我使用的是包部署模型,所以我无法添加参数绑定。

tl;博士;

删除您的子包的 HasFrontOrderDataFile。子包不能自己 运行 并且许多任务会警告 and/or 显示红色 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 粉碎 ParentVariableObject

这是一个标准的 ADO Recordset 枚举模式。我将从 ParentVariableObject 的 0 和 1 的序号位置检索值。

之后

这是回显 4 个变量值的同一个脚本任务。

子包

我的子包定义为

我在这里定义了两个变量:作为 int 的 ChildVariable 和作为对象的 ChildObjectVariable(未使用)。 ChildVariable 初始化为 -2。如果它翻转为 -1,那么我们就知道我们已经正确地提取了父值。

在包配置中,我已将 User::ParentVariableSimple 映射到 ChildVariable 的值 属性。

SCR 回声

父包中使用的相同脚本任务。我将两个子变量都传递给它。

Scr 增加 10

这就是事情变得奇怪的地方 ;)

我传入了两个ReadWriteVariables:User::ChildVariable,User::ParentVariableSimple

现在,您不能从 UI 那里 select ParentVariableSimple,您必须正确键入父包中存在的变量。其中,我的代码与上面类似。

        foreach (var item in Dts.Variables)
        {
            item.Value = (int)item.Value + 10;
        }

此时,我们正在修改父包中的值!

SQL加载父变量

我将在此处通过查询创建一个内存数据集。假设 OLE DB 连接管理器,对其进行配置

  • ResultSet = 完整结果集
  • SQL语句=SELECT ?作为 Col1,?作为 Col2;

参数映射

  • User::ChildVariable - 参数名称 0
  • User::ParentVariableSimple - 参数名称 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.

最后的想法

这是一个技巧。它有效,是的。那些在你之后维护这个包的人会诅咒你的名字直到时间的尽头。一种更简洁的方法是......在子包中引发一个事件。将 运行 的值记录到 table 并让家长读出。可能是别的,但这只是问题的技术答案。