关于SSIS变量 第三部分 变量赋值





5.00/5 (1投票)
本文讨论 SSIS 中的变量赋值。
本文概述的示例包可在此处 下载。
在我上一篇 文章 讨论了 SSIS 对象变量后,本文将探讨变量赋值。在一个 SSIS 包中,有几种方法可以为变量赋值。
默认值赋值
一旦变量被声明、作用域确定且数据类型定义完毕,就可以在“值
”字段中为其分配一个默认值。这是变量在进入作用域时将采用的值。该值将保持不变,直到某个任务更改它。
表达式
可以使用 SSIS 表达式为变量赋值,该表达式与“值
”属性一样,是变量进入作用域时将要赋的值。在 SSIS 2005-2008R2 中,变量表达式的值限制为 4,000 个字符。可以通过使用表达式将几个值连接起来来克服此限制。我在这里概述了这种技术。
表达式任务
表达式任务 (Expression Task),首次引入于 SSIS 2012,提供了使用 SSIS 表达式在任务执行后为变量赋值的能力。
脚本任务
脚本任务(Script Task)提供了两种独立的变量赋值方式。
只读/读写
第一种,也是可能最简单的一种,是在组件配置窗格中将变量列为“只读
”或“读写
”访问权限。
当变量在组件代码中被输入时,我们会看到处理变量锁定和解锁(读写)的代码。系统生成的代码允许我们直接与变量交互,而无需先锁定变量。例如,下面的 VB.NET 代码将使用 `MessageBox.Show` 方法显示已启用“读写
”访问的变量“Today
”的值,然后更改该值,并再次在消息框中显示新值。
MessageBox.Show(Dts.Variables(0).Value.ToString)
Dts.Variables(0).Value = Now.AddDays(-1)
MessageBox.Show(“The new date is ” + Dts.Variables(0).Value.ToString)
这提供了对变量的快速简便的读写访问,但它限制了变量何时根据系统生成的代码被锁定和解锁。有关更精细的变量锁定控制,您可以在代码中使用 `VariableDispenser`。
VariableDispenser
使用 `VariableDispenser` 方法确实需要更多的代码,但同样提供了对变量锁定和解锁的完全控制。在使用此方法时,请勿在脚本配置的“只读
”或“读写
”属性中包含变量,否则当您尝试以编程方式锁定或解锁变量时将会出错,因为组件的系统生成代码会处理这个问题。下面的 VB.NET 代码演示了如何使用 `VariableDispenser` 在脚本任务中直接处理变量。
Public Sub Main()
Dim vars As Variables = Nothing
Dim myVar As Variable
Dts.VariableDispenser.LockForRead(“User::Today”)
Dts.VariableDispenser.GetVariables(vars)
For Each myVar In vars
MessageBox.Show(“Variable value ” + myVar.Value.ToString + ” and name is ” + myVar.Name)
Next
Dts.VariableDispenser.LockForWrite(“User::Today”)
For Each myVar In vars
myVar.Value = Now
Next
For Each myVar In vars
MessageBox.Show(“Variable value ” + myVar.Value.ToString + ” and name is ” + myVar.Name)
Next
vars.Unlock()
Dts.TaskResult = ScriptResults.Success
End Sub
上面的代码使用 `foreach` 循环遍历所有锁定的变量,在本例中只有 `User::Today` 变量。要直接访问变量的属性和方法,可以调用 `vars(i)`,其中“`i”是变量的基于零的索引值。例如,要重新为 `today` 变量赋值,可以使用以下代码将当前日期赋值给它。
vars(0).Value = Now
执行 SQL 任务
执行 SQL 任务(Execute SQL Task)也可以通过两种不同的方式为变量赋值。
输出参数
可以通过使用将结果分配给“?
”占位符的查询来完成变量赋值。例如,下面的查询将 `SELECT GETDATE()` 的结果分配给由“?
”保存的输出参数。
SELECT ? = GETDATE()
仅使用带占位符的查询并不能完成赋值,仍然需要将变量映射到输出参数,这在“参数映射”页面上完成。在参数映射中,您选择变量(在本例中为 `User::Today`),方向(输出),以及 `ParameterName`(值 的零基索引,在本例中为 0)。经常有人问是否可以使用命名输出参数而不是索引值,事实是这取决于连接管理器。本文 概述了 可用的不同输出参数配置方法。
结果集
使用执行 SQL 任务为变量赋值的另一种方法是使用结果集。这与输出参数非常相似,唯一的区别在于查询的编写方式:没有“?
”占位符或参数名,而是只有结果集类型和结果集映射。在执行 SQL 配置页面上,结果集类型必须定义为“无”、“单行”、“完整结果集”或“XML”,具体取决于查询提供的结果类型。
在“结果集”窗格中,您再次将基于零索引的结果映射到查询的返回值。在本例中,只有一个查询会返回结果,因此索引值为零。
您可能立即注意到的一个好处是,如果您有多个变量需要赋值,例如当前日期和某个流程上次运行的日期,您可以在一个执行 SQL 任务中使用输出参数完成,而如果使用单个行结果集,则需要 2 个执行 SQL 任务。可以使用一个执行 SQL 任务,并使用完整结果集或 XML 作为结果集类型,但这在这种情况下会过于复杂,使用输出参数会更容易。
数据流任务
数据流任务(Data Flow Task)可用于变量赋值,例如,使用“行计数”(Row Count)转换来分配通过两个数据流组件的行数,或者使用“记录集”(Recordset)目标分配完整的查询结果。回到我上一篇 关于对象变量数据类型的文章,我使用了一个执行 SQL 任务来填充变量。现在,我可以使用一个数据流任务,从 `Adventureworks2012.Person.Person` 表中获取 `FirstName` 和 `LastName` 列,并将结果集发送到“记录集”目标,将其映射到我的对象变量,在本例中为 `User::Names` 变量。
本文概述的示例包可在此处 下载。