繁体   English   中英

SSIS - 如何使用 Package 部署从子 package 设置父变量值

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


我正在尝试将子变量值传递给父级,但无法使其正常工作。 我使用的是 Package 部署 Model 而不是项目部署 Model。

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

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

该值设置正确(从 0 到 1):
子脚本结果

但是回到父级,该值仍然是 0(期望 1):
父结果

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

tl;博士;

删除您的子包的 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 任务

这将运行一个子 package。 我定义了一个文件连接管理器指向 Child.dtsx

FELC Shred ParentVariableObject

这是标准的 ADO Recordset 枚举模式。 我将从 ParentVariableObject 的 0 和 1 的序数 position 中检索值。

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

儿童package

我的孩子 package 被定义为

在此处输入图像描述

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

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

可控硅回声

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

Scr 增量 10

这是 go 奇怪的地方;)

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

现在,您不能从那里的 UI 中使用 select ParentVariableSimple,您必须正确键入变量,因为它存在于父 package 中。 在里面,我的代码与上面类似。

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

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

SQL 加载父变量

我将在这里通过查询创建一个 memory 数据集。 假设 OLE DB 连接管理器,配置它

  • ResultSet = 完整的结果集
  • SQLStatement = SELECT? 作为 Col1, ? 作为 Col2;

参数映射

  • 用户::ChildVariable - ParameterName 0
  • User::ParentVariableSimple - ParameterName 1

结果集

  • 结果名称 0 - 变量名称 - User::ParentVariableObject

结果

运行的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM