变量是 Integration Services 包的有用且灵活的补充;它们可以在包中的对象之间以及父包和子包之间提供通信。 变量也可以在表达式和脚本中使用。
User-Defined 变量和系统变量
Integration Services 提供系统变量并支持用户定义的变量。 创建新包、将容器或任务添加到包或创建事件处理程序时,Integration Services 会包含容器的一组系统变量。 系统变量包含有关包、容器、任务或事件处理程序的有用信息。 例如,在运行时 ,MachineName 系统变量包含运行包的计算机的名称,以及 启动 包开始运行的时间。 系统变量是只读的。 有关详细信息,请参阅 系统变量。
可以创建用户定义的变量,然后在包中使用它们。 用户定义的变量可以在 SSIS 中以多种方式使用:在脚本中;在优先约束、For 循环容器、派生列转换和条件拆分转换使用的表达式中;和更新属性值的属性表达式中。
例如,可以在 For 循环容器的计算条件中使用用户定义的变量。 还可以将 Foreach 循环容器中的枚举器集合值映射到变量,如果执行 SQL 任务使用参数化 SQL 语句,则可以将语句的参数映射到变量。 有关详细信息,请参阅 Integration Services (SSIS) 变量。
变量使用方案
变量在 Integration Services 包中有多种不同的使用方式。 您会发现,如果不向包中添加用户定义的变量以实现解决方案所要求的灵活性和可管理性,包的开发将无法进行下去。 根据方案的不同,通常还会用到系统变量。
属性表达式 :在设置包和包对象属性的属性表达式中使用变量来提供值。 例如,表达式 SELECT * FROM @varTableName
中包含变量 varTableName
,该变量可更新“执行 SQL 任务”所运行的 SQL 语句。 表达式 DATEPART("d", GETDATE()) == 1? @[User::varPackageFirst]:@[User::varPackageOther]
" 通过在月份的第一天运行 varPackageFirst
变量指定的包而在其他天中运行 varPackageOther
变量指定的包,来更新“执行包”任务所运行的包。 有关详细信息,请参阅 在包中使用属性表达式。
数据流表达式 :在派生列转换和有条件拆分转换用于填充列的表达式中使用变量来提供值,或将数据行定向到不同的转换输出中。 例如,表达式 @varSalutation + LastName
连接 VarSalutation
变量和 LastName
列中的值。 表达式 Income < @HighIncome
将 Income
列值小于 HighIncome
变量值的数据行定向到一个输出。 有关详细信息,请参阅派生列转换、有条件拆分转换和 Integration Services (SSIS) 表达式。
优先约束表达式 :提供要在优先约束中用来确定受约束的可执行文件是否运行的值。 这些表达式可以和执行结果(成功、失败、完成)一起使用,也可代替执行结果。 例如,如果表达式@varMax > @varMin
的计算结果为true
,则可执行文件将运行。 有关详细信息,请参阅 将表达式添加到优先约束。
参数和返回代码 :为输入参数提供值,或存储输出参数和返回代码的值。 可通过将变量映射到参数和返回值来执行上述操作。 例如,如果将变量 varProductId
设置为 23 并运行 SQL 语句 SELECT * from Production.Product WHERE ProductID = ?
,查询将检索 ProductID
为 23 的产品。 有关详细信息,请参阅 执行 SQL 任务 和 执行 SQL 任务中的参数和返回代码。
For 循环表达式 :提供要在 FOR 循环的初始化表达式、求值表达式和赋值表达式中使用的值。 例如,如果变量 varCount
为 2 且 varMaxCount
为 10,初始化表达式为 @varCount
,求值表达式为 @varCount < @varMaxCount
,赋值表达式为 @varCount =@varCount +1
,则循环将重复 8 次。 有关详细信息,请参阅 For 循环容器。
父包变量配置 :将值由父包传递给子包。 子包可通过使用父包变量配置来访问父包中的变量。 例如,如果子包必须与父包使用相同日期,则子包可以定义一个父包变量配置,该配置将指定 GETDATE 函数在父包中设置的变量。 有关详细信息,请参阅 Execute Package Task 和 Package Configurations。
脚本任务和脚本组件 为脚本任务或脚本组件提供只读和可读/写变量的列表,在脚本内更新读/写变量,然后在该脚本内或该脚本外使用更新的值。 例如,在代码 numberOfCars = CType(Dts.Variables("NumberOfCars").Value, Integer)
中,脚本变量 numberOfCars
由 NumberOfCars
变量中的值更新。 有关详细信息,请参阅 Using Variables in the Script Task。
配置和变量
若要动态更新变量,可以为变量创建配置,将这些配置部署到包中,然后在部署包时更新配置文件中的变量值。 在运行时,包使用更新后的变量值。 有关详细信息,请参阅 创建包配置。