如何在包中的脚本任务中访问变量?

时间:2012-11-01 15:38:17

标签: ssis

我在Sequence Container中有两个SSIS脚本任务。我在StartTime中声明了变量 Script Task 1 。我想在Script Task 2中使用此变量。

是否可以访问StartTime中的变量Script Task 2?如何访问变量?

2 个答案:

答案 0 :(得分:8)

在SSIS包中创建变量时,可以定义变量的范围。此范围定义控制流上的哪些任务可以看到变量。

描述变量范围的示例包:

以下是SSIS包的示例。

我创建了一个包含序列容器和两个脚本任务的包。我在不同的范围内创建了四个变量。

如果要查看在不同范围下定义的所有变量,则需要检查Variables窗格上的第四个按钮。该选项由屏幕截图中的箭头指示。

以下是变量在每个范围内的工作原理:

StartTime_Package - 此变量在范围MyPackage下声明,它也恰好是包名称。这是顶级范围。该变量对控制流上的所有任务都是可见的。

StartTime_Sequence - 此变量在范围Sequence Container下声明,该范围是序列容器任务的给定名称。此变量仅对Sequence容器和序列容器中的任务可见。

StartTime_Task1 - 此变量在范围Script Task 1下声明,该范围是序列容器中第一个脚本任务的给定名称。此变量仅对第一个脚本任务可见,而不显示其他任务。

StartTime_Task2 - 此变量在范围Script Task 2下声明,该范围是序列容器中第二个脚本任务的给定名称。此变量仅对第二个脚本任务可见,而不显示其他任务。

Variables Scope

如何检查任务是否可以访问变量?

这是一种更简单的方法来识别特定任务是否可以访问变量。我们取消选中Variables窗格中的第三个选项。

点击Script Task 1。您会注意到变量StartTime_Task2未显示在“变量”窗格上,因为Script Task 1没有可见性。

同样,您可以单击任务并验证它可以访问哪些变量。

您必须根据您的要求决定变量的范围。如果要在任务之间共享变量的值,则可以在最顶层的包级别范围内声明它。

如果您非常确定不会在特定任务之外访问某个变量,则可以安全地在该任务的范围级别声明它。

Scope of the variables.

如何使用Script Task读取变量或将值写入变量?

双击脚本任务,它将带来脚本任务编辑器。您必须确定是否只想读取变量值或在任务中修改它。我将修改变量值,然后在消息框中显示该值。为此,我必须选择已在包上声明的变量,并为脚本任务提供读写访问权限。单击ReadWriteVariables属性

上的省略号按钮

Script Task Editor

选择变量将列出脚本任务可以访问的变量(系统和用户级别)。我要选择StartTime_Package变量。

Select Variables

您可以看到属性中现在列出的变量。您可以选择多个变量。单击编辑脚本,以便我们可以修改C#代码以将值写入变量,然后读取它。

Edit Script

将以下代码粘贴到“脚本任务”中。第一行分配值,这里我只是在今天的日期增加了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;
}

Script Task code

如果我们运行包,它将在消息框中显示值。该软件包于2012年11月1日执行,您可以看到软件包显示的是2012年11月8日的修改值。

Message box

希望能让您了解SSIS中的变量范围。

答案 1 :(得分:1)

确保变量(StartTime)的范围是Package - 应该这样做。变量可在整个包中使用。

在第一个脚本任务中,将变量添加为Readwrite变量,并在脚本中指定一些值。

在第二个脚本任务中,将其添加为read或readwrite变量,您可以在那里引用它。