灵活运用SQL Server2008 SSIS变量

在ssis开发etl(extract-transform-load),数据抽取、转换、装载的过程。我们需要自己定义变量

一、ssis变量简介

ssis(sql server integration services,sql server整合服务)变量分分为两种,一种是系统变量,一种用户定义的变量。系统变量包括有关包、容器、任务或事件处理程序的非常有用的信息。例如,在运行时,machinename系统变量包含运行包含的计算机的名称,starttime变量包开始运行的时间。系统变量是只读的。在ssis中,用户变量是用户在开发的过程中根据需要申明的变量。用户变量可以使用在脚本中,在由优先约束、for循环容器、派生列转换和条件性拆分转换使用的表达式中,以及在更新属性值的属性表达式中。

   在各种编程语言中申明的变量一般情况下都会有作用范围的,ssis变量也不例外,ssis变量也是有作用范围的。根据作用范围分类,变量分为包变量和组件变量。包变量在包任何一个组件中都可以调用,组件变量只能够在声明变量的组件中有效。在变量的窗口中可以看到变量的作用域。

可以看到i变量的作用域是整个package1包,而myconfig变量作用域是数据流任务组件。

二、ssis用户变量的声明、赋值、使用

1、申明变量

     申明变量是非常简单、如果你要申明包变量,只要单击控制流选项卡,然后在包开发区域空白处单击右键选择变量命令,或者新建变量按钮就新建一个变量,输入名称,选择数据类型,赋初值就完成了。

如果要声明某数据流任务组件使用的变量,只要双击该数据流任务组件,在流控制控制选项卡空白的地方单击右键选择变量命名,在变量窗口中新建一个变量命令,在变量窗口中新建一个变量,这时变量的作用域就是你选择的流任务组件。

2、赋值

   在实际开发中,除了在变量声明的时候给变量赋值外,还有两种方式,一种是通过执行sql任务组件返回值的方式给变量赋值,一种是通过脚本组件来给变量赋值。

在执行sql任务组件方法是先设置好组件的数据库连接属性,然后输入从数据库取数据的sql语句,设置组件返回的结果集为单行。在结果集界面中单击“新建”,在结果集那一列输入你刚才sql返回列的名称,在变量名称列选择你要赋值的变量

图中红色方框中的sql语句非常简单,返回单行,结果是1。在图4中,将返回的result列的一行赋值给用户变量i。

利用脚本组件赋值变量比较简单,只需要设置脚本组件的readonlyvariable或者readwritevariable,将变量的名称设置他们的值(多个变量以逗号分割),它们的区别是前者在脚本组件只能够读,或者可以读写。然后在脚本组件中通过

dts.varables("变量名称").value=值

3、变量的使用

变量在ssis中使用的地方很多,笔者介绍两个典型的应用。

  (1) 执行 sql 任务组件的参数

  假定申明了一个日期类型变量startdate,用户需要通过从某个表中选择在startdate日期之前的数据,这个时候需要将startdate作为参数传给执行 sql 任务组件。在执行 sql 任务组件输入sql的地方输入如下命令语句:

select * from table_a where 日期字段 < ?

  然后在参数据映射界面新增映射,在变量名称列选择用户变量startdate,选择类型为date,在参数名称列输入给参数取的名称。这样就可以将startdate变量传给sql任务组件的sql语句了。

  (2) 在脚本组件中赋值

  可以在脚本组件中通过dts.variables("i").value = 1方式赋值给变量,也可以通过这种方式来使用变量。比如dts.variables("other_variable").value = dts.variables("i").value+1,这个语句是可以在脚本组件中执行的,将i变量加1后赋值给另外一个变量。

相关推荐:

如何在 Python 模块中安全使用主程序的循环变量

python模块具有独立作用域,无法直接访问导入它的主程序中的变量(如循环计数器i);正确做法是通过函数参数显式传递值,而非重复import。 python模块具有独立作用域,无法直接访问导入它的主程序中的变量(如循环计数器i);正确做法是通过函数参数显式传递值,而非重复import。 在Pytho...

如何在Python中通过解包赋值优化变量交换与赋值的执行速度?

Python解包赋值不提升执行速度,其核心价值在于增强可读性、安全性和语义清晰度;它通过结构断言避免手动索引错误,适用于多值返回、可变长解包及字典传参等场景。 Python中的解包赋值本身不会提升变量交换或赋值的“执行速度”,它和传统赋值在底层开销几乎一致;真正带来收益的是代码可读性、安全性与表达意...

Python 中 nonlocal 变量在递归中未按预期更新的根本原因解析

本文深入剖析递归函数中nonlocal变量更新失效的典型陷阱:当res+=recurse(i+1)(即右值直接参与赋值)时,res仅被最后一步覆盖为首个返回值;而正确写法需确保res的读取发生在递归“回溯”阶段,即其值已被深层调用更新之后。 本文深入剖析递归函数中`nonlocal`变量更新失效的典...

Python 中 nonlocal 变量在递归中未按预期更新的原因解析

本文深入剖析递归函数中使用nonlocal变量时,因赋值表达式求值顺序不同(l-valuevsr-value位置)导致结果异常的根本原因,并通过对比代码揭示执行时序与变量读写时机的关键影响。 本文深入剖析递归函数中使用nonlocal变量时,因赋值表达式求值顺序不同(l-valuevsr-value...

如何将全局变量安全重构为局部状态变量

本文介绍在Pandasapply()场景下,如何消除global语句依赖,通过可变容器(如字典)或面向对象方式封装跨行计算所需的状态变量,提升代码可测试性、可重入性与线程安全性。 本文介绍在pandas`apply()`场景下,如何消除`global`语句依赖,通过可变容器(如字典)或面向对象方式封...