Execute SQL Task 第一篇:用法简介

Execute SQL Task 第一篇:用法简介

Execute SQL Task 第二篇:返回结果集

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指定的变量中。

 

参考文档:

Execute SQL Task

posted @ 2015-04-13 11:37  悦光阴  阅读(2887)  评论(1编辑  收藏  举报