我在Sequence Container中有两个SSIS脚本任务。我在StartTime
中声明了变量 Script Task 1
。我想在Script Task 2
中使用此变量。
是否可以访问StartTime
中的变量Script Task 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窗格中的第三个选项。
点击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中的变量范围。
答案 1 :(得分:1)
确保变量(StartTime)的范围是Package - 应该这样做。变量可在整个包中使用。
在第一个脚本任务中,将变量添加为Readwrite变量,并在脚本中指定一些值。
在第二个脚本任务中,将其添加为read或readwrite变量,您可以在那里引用它。