提问人:Conrad Jagger 提问时间:11/1/2012 最后编辑:Conrad Jagger 更新时间:11/2/2012 访问量:7544
如何跨包中的脚本任务访问变量?
How can I access a variable across script tasks within a package?
问:
我在序列容器中有两个 SSIS 脚本任务。我已经在 中声明了变量 StartTime
。我想在 中使用这个变量。Script Task 1
Script Task 2
是否可以访问其中的变量?如何访问该变量?StartTime
Script Task 2
答:
确保变量 (StartTime) 的作用域为 Package - 这应该可以。变量可用于整个包。
在第一个脚本任务中,将变量添加为 Readwrite 变量,并可能在脚本中分配一些值。
在第二个脚本任务中,将其添加为读取或读取写入变量,您可以在那里引用它。
在 SSIS 包中创建变量时,可以定义变量的作用域。此范围定义控制流上的哪些任务对变量具有可见性。
描述变量作用域的示例包:
下面是一个示例 SSIS 包。
我创建了一个包,其中包含一个序列容器和两个脚本任务。我在不同的作用域下创建了四个变量。
如果要查看在不同作用域下定义的所有变量,则需要选中窗格上的第四个按钮。该选项由屏幕截图中的箭头指示。Variables
以下是变量在每个作用域中的工作方式:
StartTime_Package
- 此变量在作用域下声明,该作用域也恰好是包名称。这是顶级范围。此变量将对控制流上的所有任务可见。MyPackage
StartTime_Sequence
- 此变量在作用域下声明,作用域是序列容器任务的给定名称。此变量仅对 Sequence 容器和序列容器中的任务可见。Sequence Container
StartTime_Task1
- 此变量在作用域下声明,作用域是序列容器中第一个脚本任务的给定名称。此变量仅对第一个脚本任务可见,而对其他任务不可见。Script Task 1
StartTime_Task2
- 此变量在作用域下声明,作用域是序列容器中第二个脚本任务的给定名称。此变量仅对第二个脚本任务可见,而对其他任务不可见。Script Task 2
如何检查任务是否可以访问变量?
这是确定特定任务是否可以访问变量的更简单方法。让我们取消选中“变量”窗格上的第三个选项。
单击 .您会注意到,该变量未显示在“变量”窗格中,因为它没有可见性。Script Task 1
StartTime_Task2
Script Task 1
同样,您可以单击任务并验证它可以访问哪些变量。
您必须根据自己的要求决定变量的作用域。如果要在任务之间共享变量的值,则可以在最顶层的包级别范围内声明该变量。
如果您非常确定不会访问特定任务之外的某个变量,则可以在该任务的作用域级别声明它是安全的。
如何使用脚本任务读取变量或将值写入变量?
双击脚本任务,它将带来脚本任务编辑器。您必须确定是只想读取变量值还是在任务中修改它。我将修改一个变量值,然后在消息框中显示该值。为此,我必须选择一个已经在包上声明的变量,并为脚本任务提供读写访问权限。单击属性旁边的省略号按钮ReadWriteVariables
选择变量将列出脚本任务有权访问的变量(系统级和用户级)。我要选择变量。StartTime_Package
您可以看到该变量现在列在属性中。您可以选择多个变量。单击“编辑脚本”,以便我们可以修改 C# 代码以将值写入变量,然后读取它。
将以下代码粘贴到脚本任务中。第一行分配值,这里我只是在今天的日期上增加了 7 天。第二行在消息框中显示变量的值。
public void Main()
{
Dts.Variables["StartTime_Package"].Value = DateTime.Now.AddDays(7);
MessageBox.Show(Dts.Variables["StartTime_Package"].Value.ToString());
Dts.TaskResult = (int)ScriptResults.Success;
}
如果我们运行包,它将在消息框中显示值。该包于 2012 年 11 月 1 日执行,您可以显示该包显示 2012 年 11 月 8 日的修改值。
希望这能让您对 SSIS 中的变量范围有所了解。
评论