【问题标题】:SSIS - How to set parent variable value from child package using Package Deployment ModelSSIS - 如何使用包部署模型从子包中设置父变量值
【发布时间】:2020-08-22 12:16:44
【问题描述】:


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

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

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

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

但是返回给parent,值还是0(期望1):

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

【问题讨论】:

  • 我的假设一直是这只适用于父>子。它永远无法将值从孩子传回给父母。
  • 即使您使用的是项目部署模型,也只会简化将参数传递给子进程的过程。包参数在子包中是只读的,因此没有机会将信息发送回父包。
  • 我想这个的时间越长,我从 Andy Leonard 那里偷了一个技巧,其中子包会修改父包变量(它正在返回一个结果集),但我敢打赌,这个技巧是父包的变量是对象类型。这可能是有道理的,因为对象引用将被传递给子包,而任何不是 Object 类型的东西都将通过值传递。欢迎您查看会话是否已发布到 PASS youtube 频道。那是 2009 年的峰会。
  • 所以是的,你可以做到,但这是设计的味道吗?如果您尝试使用子包,例如返回值的函数,我怀疑这里存在一些设计问题。
  • 哦,完全同意。这是黑客攻击的力量。 ;)

标签: ssis


【解决方案1】:

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.

最后的想法

这是一个黑客。它有效,是的。那些在你之后维护这个包裹的人会诅咒你的名字直到时间结束。一种更简洁的方法是......在子包中引发一个事件。将该运行的值记录到表中并让父级读出它。可能是别的东西,但这只是问题的技术答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多