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
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
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.
最后的想法
这是一个黑客。它是有效的,是的。那些