变量和属性表达式是 SSIS 设计中非常重要的组成部分,它们是提高SSIS 灵活性的主要手段。变量和属性表达式是互相关联的,通常在属性表达式中常常使用变量,所以我把他们放在一起介绍。
变量
早在 SQL Server DTS 中就引入了变量的概念,它的定义就像其他程序语言一样,起到在程序中 SSIS Package 中重复使用,灵活赋值的作用。程序设计语言中有全局变脸和局部变量的区别,从 SSIS 2005 开始,也引入了这个类似的定义。
SSIS 变量从作用范围上说有两种分类:Package 级别的变量和 Container 级别的变量。Package 级别的变量跟全局变量的定义类似,它的作用范围是整个 SSIS Package,在 Package 的任何一个组件中都可以访问它。Container 级别的变量类似于局部变量,它的使用范围局限于定义它的 Container 或者是控制流任务。同一范围的变量它们的名字不能重复,但是不同范围的变量,他们的名字可以重复!
SSIS 变量从定义方式分为系统变量 和用户自定义变量 ,系统变量顾名思义 是系统内置的变量,我们不能增加和删除系统变量,我们只能读取它们的值而不能修改它们的值。系统变量保存了一切与当前 Package 或者 Container 有关的信息,比如 Container 的名字、建立的时间、版本号等等。如果我们的Package 用错误捕获的设置,系统变量中好保存着错误信息等。系统变量的存取是根据当前 Package 中的任务不同而变化的。
用户自定义变量是最用开发者定义的变量,它常用来动态地设置 Package 中可以访问的信息,或者作为处理过程中的中间媒体保存动态的值等。我们在使用属性表达式的时候通常需要访问系统变量或者用于自定义变量。
不论是系统变量还是用户自定义变量,它们有一个有用的属性:Raise Change Event,这个属性的默认值是 False. 如果它的值设置为 Ture, 那么当SSIS Package 设置了执行日志(Logging) 的时候,日志中的 OnVariableValueChanged 事件才能捕获到这个变量的变化。也就是说在默认情况下,即使在 Logging 中选择了 OnVariableValueChanged 属性,如果变量的 Raise Change Event 仍然是默认值 False 的话,那么它在运行中值的变化也不能被 Log 记录下来。
属性表达式
属性表达式是 SSIS Package 开发中相对比较高级的话题,它可以是我们的 SSIS Package 变得相当地灵活。属性表达式存在于所有的控制流任务和数据连接中,它用来在运行阶段设置该任务或者数据连接的某些属性,如果一个控制流任务使用属性表达式 设置了它的值,那么它在属性表达式中设置的值将在运行阶段覆盖设计阶段的赋值。
下面我用一个例子来介绍属性表达式的使用,在这个例子中我使用一个变量来动态地设置 SQL Statement 的值
- 打开上一节课我介绍 For Loop Container 的例子。
- 新增加一个 For Loop Container 级别的变量:MyName, Data Type 设置为 String, 将其默认值设置为 ThisName。
- 双击 For Loop Container 中的 Execute SQL Task 打开 Expression 页面, 这个任务用来向 Clients 表中插入记录。打开属性表达式编辑器,在 Property (属性)列中选择 SqlStatementSource, 在表达式中输入下面的语句:
“Insert Into dbo.Clients (ClientName) Values (‘” + @[User::myName] + “‘ + Convert(Varchar,?))”