关于 SSIS 变量 - 第 1 部分





5.00/5 (1投票)
关于 SSIS 变量 - 第 1 部分
自 2005 年首次引入以来,SSIS 中就一直可以使用变量。那么它们到底有什么用,您可以使用变量做什么?很高兴您问了!!变量可以用于许多不同的目的
- 定义包的路径
- 保存系统信息,例如错误信息
- 提供创建自定义日志记录的方法
- 保存结果集以进行迭代
让我们从一个简单的例子开始,比如使用一个变量来定义包的路径。假设您必须执行一个数据流任务,并且根据加载的行数来决定接下来应该发生什么任务。使用变量和优先级约束来实现这一点非常简单。第一步是创建一个变量,这在 SQL Server Data Tools 的变量窗格中完成
范围
从变量窗格中要注意的第一件事是范围。范围定义了变量将可用的位置。例如,我的变量“RowCount
”的范围设置为我的包,我将其命名为RowCount
。这意味着包中的任何任务,包括子包,都可以访问该变量。最佳做法是确保变量的范围仅限于需要它的地方。这个包总共有三个任务
- 数据流任务,它将从
Adventureworks2012.Person.Person
表中获取数据,通过行计数转换,并将数据发送到平面文件目标 - 如果行计数大于 1,000,则执行的脚本任务
- 如果行计数小于 1,000,则执行的脚本任务
在这种情况下,范围设置为包,因为所有 3 个任务都需要访问该变量。如果包包含不需要访问变量的其他控制流任务,则可以通过将三个受影响的任务放在一个序列容器中并将范围设置为容器来限制范围。
数据类型
数据类型定义了对象的类型以及变量可以保存的可接受值。另一个重要因素是为变量分配最有效的数据类型。例如,如果变量将保存介于-128
和128
之间的数值,则最有效的数据类型是SByte
,而不是UInt
,后者可以保存介于0
和65,535
之间的数值。MSDN 在此文档化了数据类型。
值
这保存了变量的值。此值可以在包中使用脚本任务、表达式任务、执行 SQL 任务以及其他几个任务进行更改。
表达式
表达式提供了一种使用 SSIS 表达式为变量赋值的方法。同样,这可以在稍后在包中更改,但一旦包执行开始并且变量范围被调用,则来自表达式的值或值将提供变量值,直到并且如果它被更改。
配置好变量后,我现在将包括我的数据流任务,该任务将记录从源Adventureworks2012.Person.Person
到目标的所有行的值,到平面文件目标,使用行计数转换。这很容易做到,因为一旦将数据源连接到行计数,系统将提示您输入将用于保存此数值的变量。
优先级约束
记住这些要求,我们现在必须根据数据流的成功和处理的行数(现在保存在我们的变量中)来定义执行路径。通过使用我们的On Success优先级约束连接两个脚本任务,然后我们可以更改两个约束以使用表达式和约束,我们可以定义一个约束以使用表达式@[User::RowCount] > 1000
,另一个约束使用表达式@[User::RowCount] < 1000
。这种方法将留下一个未被覆盖的路径,即如果RowCount == 1000
。在这种情况下,我们对此不感兴趣,所以我们让它运行。
每个脚本任务都将用于访问变量并在消息框中显示它,然后将变量重置为 0。这要求这两个任务都需要对变量具有读写访问权限。
Public Sub Main()
MessageBox.Show(“The row count was: ” + Dts.Variables(“RowCount”).Value.ToString)
Dts.Variables(“RowCount”).Value = 0
MessageBox.Show(“The row count was: ” + Dts.Variables(“RowCount”).Value.ToString)
Dts.TaskResult = ScriptResults.Success
控制流中的最终包如下所示
您会注意到优先级约束是绿色的,这意味着只有在前面的任务成功完成后才会采用该路径。您还会注意到,每个优先级约束旁边都有一个“fx
”,这意味着该约束也基于优先级。
这显然是一个非常简单的例子,但这是该系列中的第一个例子,因此我们随着每个新帖子的发布而进行。
示例包,在 SSDT 2012 中完成,可以在这里下载。