Execute SQL Task 第一篇:用法简介
Execute SQL Task组件是SSIS中最重要的Control Flow Task之一,可以直接执行TSQL语句修改数据,例如,可以执行数据更新命令(update,delete,insert),也可以执行select查询语句,把返回的结果存储到变量中。
一,General 选项卡
Genernal 选项卡中,配置EXECUTE SQL TASK组件的常用属性。
1,简单的属性
TimeOut 选项:指定Task超时的时间,单位是秒,默认值是0,表示超时时间无限长。
CodePage 选项:指定Code Page,在把Unicode值传递给变量时,用于把字符串值翻译成特定的code page。该选项仅用于OLE DB 和ADO.NET 连接。
TypeConversionMode选项:如果设置为Allowed,当把输出型参数(output parameter)和查询结果(Single row)赋值给变量时,Execute SQL Task将尝试把输出型参数和查询结果转换为变量的数据类型,这个选项仅适用于单行结果集类型。
2,返回结果集(Result Set)
Task组件返回的结果集,
- None:表示不返回结果,在执行Update,delete或insert命令时,使用该选项;
- Single row:返回单行结果,可以在Result Set 选项卡中,将结果集返回到1个或多个变量中
- Full result set:返回多行结果,结果集存储在object对象中
- XML:返回的结果是XML类型,常用于for xml 子句中。
如果Execute SQL Task 使用 Full result set, 查询会返回多个行集(multiple rowsets),但是该Task只会获取第一个行集(rowset)。
2,组件执行的SQL命令(SQL Statement)
- ConnectionType:连接到数据源的链接类型,如果是OLEDB链接,选中OLE DB;
- Connection:链接管理器
- SQLSourceType:SQL数据源的类型,共有三个选项:Direct Input,File Connection 和 Variable。Direct Input表示:直接输入SQL命令;FileConnection表示:将SQL命令保存在.sql文件中;Variable表示:把SQL命令保存在SSIS的变量中。
- SQLStatement:要执行的SQL语句,根据SQLSourceType的不同,有三种不同的值:SQL语句,.sql文件路径,或SSIS变量;
3,举个例子
如果Execute SQL Task执行的SQL命令是动态变化的,使用Variable选项较好。
首先创建一个变量,变量的数据类型是String,为变量赋值为有效的TSQL语句:
设置SQLSourceType 为 Variable 类型,并在SourceVariable中设置保存TSQL语句的变量:
二,Expressions选项卡
SSIS Package的属性,既可以在General 选项卡中手动配置,也可以在Expressions 选项卡中通过参数配置。通过表达式配置的属性,最终会覆盖在General选项卡中显式配置的属性。Execute SQL Task的各个属性,都可以在Expression中进行配置,如果把属性的值保存到变量中,那么动态控制Task的执行。
示例,将SqlStatementSource的值存储在变量中,效果和把SqlSourceType 配置为Variable是一样的,只不过实现方式不同,并且SSIS在执行过程中,使用Expressions的属性覆盖General中配置的属性值。
三,Result Set选项卡
Result Set 选项卡用于把Task返回的结果集绑定到变量中,如果ResultSet的类型是None,那么该选项卡是禁用的。
在General选项卡中,如果把Result Set设置为Single Row,那么Result Name 可以是返回字段的名称,也可以是字段的序号,序号从0开始,
如果Result Set的类型是 Full result set 或 XML,那么Result Name 必须是字段的序号,序号从0开始。
四,Parameter Mapping 选项卡
如果SQL命令在执行的过程中需要传递参数,那么需要在Parameter Mapping 选项卡中进行配置,把变量和参数绑定到一起。变量在SSIS中创建,而参数需要在SQL命令中配置,不同类型的连接管理器,SQL命令中的参数占位符是不同的。
1,参数的方向(Direction)
- 如果SQL命令是输出型参数,那么需要设置Direction为Output,表明SQL 命令把参数的值传递给变量;
- 如果SQL 命令是输入型参数,那么需要设置Direction为Input,表明把变量的值传递给SQL 命令;
- 如果SQL命令会返回值,那么需要设置Direction为ReturnValue,表明把SP的返回值传递变量。
2,参数的名称
如果使用的OLE DB 链接,需要使用 ?代表一个参数,并且在Parameter Mapping 中将parameter name设置为参数的序号,第一个?的序号是0,第二个?的序号是1,参数的序号从0依次递增,通过顺序来匹配。如果使用的是Ado.Net连接管理器,那么参数的命名格式是 @varParameter,使用参数名来匹配。
详细信息,请阅读《Parameters in the Execute SQL Task》
3,参数的类型
参数的类型非常丰富,除了NULL和GUID之外,可以分为:
- 有符号的整数型:SIGNEDCHAR、SHORT、LONG、LARGE_INTEGER
- 无符号的整数型:BYTE、USHORT、ULONG、ULARGE_INTEGER
- 精确小数类型:DECIMAL、CURRENCY、NUMERIC、DB_VARNUMERIC
- 浮点数类型:FLOAT、DOUBLE
- 布尔值类型:VARIANT_BOOL
- 字符串类型:VARCHAR、NVARCHAR
- 日期类型:DATE、DBDATE
- 时间类型:DBTIME、DBTIME2
- 日期和时间类型:DBTIMESTAMP、DBTIMESTAMPOFFSET、FILETIME
对于日期和时间类型,它们的字符串格式如下:
对于OLE DB连接管理器,当需要处理SQL Server数据类型是 date, time, datetime, datetime2, 和 datetimeoffset 时,需要根据参数的方向来设置参数的类型,参数类型的设置有如下规则:
- 对于输入型参数,参数的类型设置为:NVARCHAR
- 对于输出型参数,参数的类型设置如下表所示
五,获取返回值
从存储过程中获取返回值,有两种方式:通过输出型参数和SP返回的值。设置参数的方向为ReturnValue
对于OLEDB连接管理器,需要设置以下SQL语句:
EXEC ? = myStoredProcedure 1
六,返回的结果集
在SSIS Package中,使用Execute SQL Task 可以获得SQL语句返回的结果集。
1,结果集的类型
指定结果集的类型
- None:查询不返回任何结果,常见于insert、delete和update命令中。
- Single row:查询语句只返回单行
- Full result set:查询语句返回对行
- XML:查询语句返回的结果集是XML格式,常见于带 FOR XML的SELECT命令中
如果 Execute SQL task使用 Full result set ,并且查询语句返回多个行集(multiple rowsets),该Task只会获取第一个行集(first rowset)
2,把结果集绑定到变量
如果结果集的类型是 single row, rowset, 或 XML,可以把结果集绑定到用户自定义的变量中。
在参数映射中,Result Name的名称有如下规则:
- 当结果集的类型是Single row时,使用列名或列的序号(从0开始)把列绑定到变量中。
- 当结果集的类型是full result set 或XML时,必须使用 0作为结果集的名称。
结果集和变量的数据类型必须兼容:
- 对于Single row结果集,行中每列的类型必须和变量的类型相兼容。
- 对于XML结果集,绑定的变量的数据类型是String 或 Object数据类型。如果变量的类型是String,那么 Execute SQL task 返回字符串类型;如果变量的类型是Object,那么 Execute SQL task 返回的是Document Object Model (DOM) object。
- 对于Full result set结果集,绑定的变量的数据类型必须是Object数据类型,返回的结果是一个行集对象(rowset object),可以把变量传递给Foreach Loop 容器,通过该Foreach Loop容器逐行抽取表中各行中的列。
七,返回受影响数据的行数
ExecValueVariable 属性是Task的标准属性。有些Task在执行完成后,会返回输出结果,为了获取Task的输出结果,我们可以定义一个变量,存储输出结果。Task的ExecValueVariable属性就是用来指定存储Task输出结果的变量名。默认属性值是none,表示task的输出结果不会被存储。
Execute SQL Task 返回被更新的数据的行数,我们可以为ExecValueVariable属性指定一个变量,用来接收Task的输出值(Execution value),在下游组件中可以引用该变量,获取 Execute SQL Task 更新的数据行数。
Returns the number of rows affected by the SQL statement(s).The ExecValue is using the @@ROWCOUNT to assign the value of the variable and absent a @@ROWCOUNT the value returned is -1.
示例 Execute Sql Task的ExecValueVariable 用法
1,设计Package的Control Flow
Execute Sql Task的属性:ExecValueVariable的值是变量varCount,该Task执行的SQL语句如下:
insert into dbo.delay_test VALUES(1),(2),(3) insert into dbo.delay_test VALUES(2),(3)
Task:insert Data执行的SQL语句是,传入的参数是User::varCount
insert into dbo.dt_test values(?)
2,简称结果
第一个Task返回的结果是varCount是2,这个结果实际上是@@RowCount,SSIS在执行语句之后,将@@RowCount赋值到Execute SQL Task 属性ExecValueVariable指定的变量中。
参考文档: