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

SSIS-如何使用包部署模型从子包设置父变量值,ssis,Ssis,我试图将子变量值传递给父变量,但无法使其工作。我使用的是包部署模型,而不是项目部署模型。 父变量和子变量的名称完全相同。我使用包配置引用了子包中的父变量。 然后在子脚本任务中设置值: 该值设置正确(从0到1): 但回到父级,该值仍然为0(应为1): 因为我使用的是包部署模型,所以无法添加参数绑定。 tl;博士 删除子包的HasFrontOrderDataFile。子包将无法自行运行,许多任务将发出警告和/或显示红色X,指示它们已损坏,但当父包运行时,它们将正常工作 设置 给定一个包含4个变


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

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

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

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

但回到父级,该值仍然为0(应为1):

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

tl;博士 删除子包的HasFrontOrderDataFile。子包将无法自行运行,许多任务将发出警告和/或显示红色X,指示它们已损坏,但当父包运行时,它们将正常工作

设置 给定一个包含4个变量的父包:Col1、Col2、ParentVariableSimple all as 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 Shred PARENTVARIABLE对象 这是标准的ADO记录集枚举模式。我将从ParentVariableObject的0和1的序号位置检索值

之后 这是同一个脚本任务,它会回显4个变量的值

子包 我的子包定义为

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

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

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

Scr增加10 这就是事情变得奇怪的地方;)

我传入两个读写变量:User::ChildVariable、User::ParentVariableSimple

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

        foreach (var item in Dts.Variables)
        {
            item.Value = (int)item.Value + 10;
        }
此时,我们正在修改父包中的值

SQL加载父变量 我将在这里通过查询创建内存中的数据集。假设使用OLE DB连接管理器,请对其进行配置

  • 结果集=完整结果集
  • SQLStatement=SELECT?作为Col1?如Col2
参数映射

  • 用户::ChildVariable-参数名称0
  • 用户::ParentVariableSimple-参数名称1
结果集

  • 结果名称0-变量名称-用户::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.
最后的想法 这是一个黑客。它是有效的,是的。那些在你之后维护这个包的人会诅咒你的名字直到时间的尽头。一个更干净的方法是。。。在子包中引发事件。将该运行的值记录到表中,并让父级读取该值。可能是别的,但这只是这个问题的技术答案。

tl;博士 删除子包的HasFrontOrderDataFile。子包将无法自行运行,许多任务将发出警告和/或显示红色X,指示它们已损坏,但当父包运行时,它们将正常工作

设置 给定一个包含4个变量的父包:Col1、Col2、ParentVariableSimple all as 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 Shred PARENTVARIABLE对象 这是标准的ADO记录集枚举模式。我将从ParentVariableObject的0和1的序号位置检索值

之后 这是同一个脚本任务,它会回显4个变量的值

子包 我的子包定义为

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

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

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

Scr增加10 这就是事情变得奇怪的地方;)

我传入两个读写变量:User::ChildVariable、User::ParentVariableSimple

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

        foreach (var item in Dts.Variables)
        {
            item.Value = (int)item.Value + 10;
        }
此时,我们正在修改父包中的值

SQL加载父变量 我将在这里通过查询创建内存中的数据集。假设使用OLE DB连接管理器,请对其进行配置

  • 结果集=完整结果集
  • SQLStatement=SELECT?作为Col1?如Col2
参数映射

  • 用户::ChildVariable-参数名称0
  • 用户::ParentVariableSimple-参数名称1
结果集

  • 结果名称0-变量名称-用户::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.
最后的想法 这是一个黑客。它是有效的,是的。那些