我们在做SqlServer SSIS包开发的时候,经常会用到SSIS的变量,我们可以使用和修改SSIS变量的值使得SSIS包的逻辑更灵活,如下图所示:
在定义SSIS变量的时候可以使用固定值(如上图中的变量Number),也可以是使用表达式(如上图中的变量Sql),使用表达式的时候可以让变量去使用另一个变量的值,比如下图是变量Sql的表达式,其中就使用了变量Number的值:
顺便说一下,本文上面的截图都是基于SqlServer2012的SSIS包,也就是VisualStudio 2010的SSIS包,其实也VisualStudio 2008的SSIS包的变量也可以使用表达式,不过VisualStudio 2008需要打开VisualStudio的属性窗口后才能定义SSIS变量的表达式,如下图所示先在SSIS变量窗口选中要使用表达式的变量(变量MID_MonthsOver_SQL)
然后从视图(View)下拉菜单中选中属性窗口(Properties Window)
然后在属性窗口中就可以像在VisualStudio 2010中一样编辑变量的表达式(Expression)了
不管是在VisualStudio 2010还是VisualStudio 2008的SSIS变量上,都有一个设置叫EvaluateAsExpression,这个设置可以在变量的属性窗口(Properties Window)中可以看到(怎么打开变量的属性窗口上面已经说了),如下图所示:
默认情况下SSIS变量的EvaluateAsExpression是为False的,但是一旦你为SSIS变量使用了表达式(Expression),这个设置就会被自动改变为True,当然你也可以手动改回False,那么EvaluateAsExpression为True和False的时候有什么不同呢?
实际上EvaluateAsExpression设个设置只有在SSIS变量使用表达式(Expression)的时候才会起作用,它的作用是在获取变量值的时候是否动态计算变量的表达式。
举例说明,下图中我们设置了一个String类型的SSIS变量Sql,它的值依赖于Int32类型的变量Number,Number的初始值为0
然后我们在SSIS包的控制流中定义了三个Sequence Container(Sequence Container,Sequence Container 1,Sequence Container 2),每一个Sequence Container都会使得变量Number的值先加1,然后输出变量Sql的值
如果变量Sql的EvaluateAsExpression为True,三个Sequence Container的输出结果为下面所示:
但是如果变量Sql的EvaluateAsExpression为False,我们运行SSIS包会得到下面三个输出结果:
这说明当变量Sql的EvaluateAsExpression为True时,每当在SSIS包中获取变量Sql的值时都会动态地去计算它的表达式(Expression),用表达式的最新结果作为变量Sql的值。而当变量Sql的EvaluateAsExpression为False时,其表达式只会为变量Sql提供一个初始值,在SSIS包中获取变量Sql的值时每次都返回的是这个初始值,而不会重新去计算变量Sql的表达式。