Execute SQL Task 第一篇:用法简介

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

Execute SQL Task 第三篇:参数和变量的映射

Execute SQL Task能够执行带参数的SQL查询语句或存储过程(SP),通过SSIS的变量(Variable)对参数赋值。对于不同的Connection Manager,在Task中需要使用不同的符号(Parameter marker)来标记一个参数,并且在Parameter Mapping中设置参数名字(Parameter Name)。

在Execute SQL Task Editor中,设置Parameter Mapping的界面如下:

  • Variable Name:变量的名字,变量的作用域分为UserSystem,使用 :: 来引用作用域中的变量
  • Direction:参数的方向,分为输入参数(Input),输出参数(Output)和返回值(Returnvalue)
  • Data Type:参数的Data Type,必须和变量(Variable)的数据类型相兼容
  • Parameter Name:参数名字,不同的Connection Manager,其值不同,对于OLEDB Connection Manager,使用0,1,2等数值表示第一个,第二个参数,第三个参数等。
  • Parameter Size:默认值是-1,表示让SSIS确定参数的长度。如果参数的数据类型是变长的(varchar或varbinary),必须设置参数的长度,为参数值分配足够长度的空间。

在Parameter Mapping中,Parameter Marker和Name受到Connection Type的影响,如下表:

Connection type Parameter marker Parameter name Example SQL command
ADO ? Param1, Param2, … SELECT FirstName, LastName, Title FROM Person.Contact WHERE ContactID = ?
ADO.NET @<parameter name> @<parameter name> SELECT FirstName, LastName, Title FROM Person.Contact WHERE ContactID = @parmContactID
ODBC ? 1, 2, 3, … SELECT FirstName, LastName, Title FROM Person.Contact WHERE ContactID = ?
EXCEL and OLE DB ? 0, 1, 2, 3, … SELECT FirstName, LastName, Title FROM Person.Contact WHERE ContactID = ?

1,执行SQL查询语句

楼主在实际开发中,最常用的Connection Type是OLEDB,设置Task的ConnectionType为OLE DB,在SQLStatement属性中使用 ? 来标记一个参数,? 叫做参数标记(Parameter Marker)。

select ID,c1
from dbo.dt_test
where c1=?

使用SSIS 变量(Variable)为参数赋值,Parameter Name必须是0,1,2等数字

2,执行SP,设置参数的方向

使用Execute SQL Task执行SP时,参数映射的Direction属性使用Input,Output和Returnvalue 分别表示:输入参数,输出参数和SP的返回值

declare @return_value int
declare @output_var int
declare @input_var int
set @input_var=1
exec @return_value=dbo.usp_test @para1=@input_var, @para2= @output_var output;

使用OLEDB Connection Manager,使用 ? 表示一个参数,如图

在Parameter Mapping Tab中设置参数映射:

  • 第一个参数是SP的返回值,Direction 选择 Returnvalue,Parameter Name 是 0;
  • 第二个参数是SP的输入参数,Direction 选择 Input,Parameter Name 是 1;
  • 第三个参数是SP的输出参数,Direction 选择 Output,Parameter Name 是 2;

3,设置参数的Data Type

楼主整理的参数的Data Type和TSQL 数据类型的映射关系

3.1,数值类型

  • BYTE:映射 SSIS 的 DBTYPE_UI1,映射 TSQL 的 TinyInt
  • SHORT:映射 SSIS 的 DBTYPE_I2, 映射 TSQL 的 smallint
  • LONG:映射 SSIS 的 DBType_I8,映射 TSQL 的 bigint
  • FLOAT: 映射 TSQL 的 float(24)
  • DOUBLE:映射 TSQL 的 float(53)
  • DECIMAL: 映射 TSQL 的 decimal

3.2,日期/时间类型

  • DATE:映射TSQL的DateTime2(7)

注意:如果SSIS 变量的Data Type是DateTime,那么参数的Data Type应使用 DATE,但是,数据类型为DateTime的变量,只保留到秒,毫秒位是0.

3.3,字符串类型

  • VARCHAR: 映射TSQL的varchar
  • NVARCHAR: 映射TSQL的nvarchar

4,在做增量更新时,发现导入的数据量少于源数据

楼主在调试SSIS Package时,使用ModifiedDate字段做增量更新,Package中使用Execute SQL Task获取数据源中DataUpdateTime字段的最大值,并将该值赋值给变量:User::MaxLastModifiedDate,Package运行成功,但是导入的数据量少于源数据;通过测试,发现DateTime类型的变量,其时间部分只保留到秒,而不会计算毫秒部分,导致导入的数据量少于源数据。

调试SSIS Package,下断点(breakpoint),打开Watch Tab,查看变量运行时的值:

这两个变量定义为DateTime类型,经过测试,如果变量定义成String类型,实际上是一样的,时间只会精确到秒:

然而,数据源中的DataUpdateTime使用的Datetime2(7),精度十分高:

发生这种问题的根源是 SSIS的数据类型和SQL Server的数据类型不是一一对应的,存在差异。为了避免这种问题,可以对MaxLastModifiedDate 变量加1s。

在使用OLEDB数据源导入数据时,使用如下的Where条件,就能把所有的数据都导入到DW中。

where DataUpdatedOn > ?    --MinLastModifiedDate
and DataUpdatedOn<=? --MaxLastModifiedDate

注意:SSIS 变量的日期和时间类型只保留到秒,而数据库中的时间可以保留到毫秒位(1-7位毫秒数)

参考文档:

SQL Server SP2 – What’s new for SSIS

Map Query Parameters to Variables in an Execute SQL Task

Parameters and Return Codes in the Execute SQL Task

Execute SQL Task 参数和变量的映射的更多相关文章

  1. Execute Sql Task 的Result DataSet如何返回

    Execute Sql Task的Result DataSet 主要有以下四种,当Execute Sql Task返回结果之后,需要使用SSIS Variable 来接收数据. 例子中使用的数据表代码 ...

  2. SSIS Execute SQL Task 用法

    Execute Sql Task组件是一个非常有用的Control Flow Task,可以直接执行SQL语句,例如,可以执行数据更新命令(update,delete,insert),也可以执行sel ...

  3. Execute SQL Task 如何返回结果数据集

    Execute Sql Task的Result DataSet 主要有以下四种,当Execute Sql Task返回结果之后,需要使用SSIS Variable 来接收数据. 例子中使用的数据表代码 ...

  4. SSIS中Sql Task 获取系统变量

    原文:SSIS中Sql Task 获取系统变量 执行 SQL 任务使用不同的连接类型时,SQL 命令的语法使用不同的参数标记.例如,ADO.NET 连接管理器类型要求 SQL 命令使用格式为 @var ...

  5. 微软BI 之SSIS 系列 - Execute SQL Task 中的 Single Row 与 Full Result Set 的处理技巧

    开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL ...

  6. [转]SSIS Execute SQL Task : Mapping Parameters And Result Sets

    本文转自:http://www.programmersedge.com/post/2013/03/05/ssis-execute-sql-task-mapping-parameters-and-res ...

  7. [转]Working with Parameters and Return Codes in the Execute SQL Task

    本文转自:http://msdn.microsoft.com/zh-cn/magazine/cc280502(en-us,SQL.100).aspx SQL statements and stored ...

  8. ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法

    ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法 有些情况下,SQL SERVER 2008r2中需要保存float,int类型的数据,当C 中的变量为double ...

  9. mybatis在动态 SQL 中使用了参数作为变量,必须要用 @Param 注解

    如果在动态 SQL 中使用了参数作为变量,那么就要用 @Param 注解,即使你只有一个参数.如果我们在动态 SQL 中用到了 参数作为判断条件,那么也是一定要加 @Param 注解的,例如如下方法: ...

随机推荐

  1. IntelliJ IDEA 绝对好用快捷键

    最近根据自己的使用习惯整理了一下在windows下常用的一些快捷键,有些确实非常实用. 常用快捷键  键 作用 备注 Ctrl+F12 显示当前类的所有方法   F2 定位下一个错误位置   Alt ...

  2. Python for Infomatics 第14章 数据库和SQL应用三(译)

    14.5 SQL 总结 到目前为止,我们在Python示例程序中使用了SQL,并且涉及了许多SQL基础.在这一小节中,我们特别审视SQL语言,并对其语法进行回顾. 虽然有很多不同的数据库供应商,但因S ...

  3. js禁用右键菜单、选中、复制、剪切、粘贴

    //屏蔽右键菜单 document.oncontextmenu = function (event) { if (window.event) { event = window.event; } try ...

  4. ITree诞生啦!

    经过一个月的码码码,一个面向OIer的ITree终于来辣! ... (似乎把OI遗弃在了某个角落了........... 一个月里,从只会py到写出ITree,真是不容易呢(其实就是两个多礼拜而已= ...

  5. Javascript 面向对象编程(一):封装

    Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...

  6. qgis自定义坐标系与qgis.db问题

    将编译好的qgis库整理,屏蔽获取删除环境变量中的路径,测试qgis.exe程序功能 如出现如上提示: 原因:是未找到qgis.db文件,无法拷贝到系统默认的C:/Users/Administrato ...

  7. vue 学习笔记

    使用vue框架做了一个项目,在这个过程中,摸索学习了vue,把过程学习到技术整理放在这里,供以后查看.

  8. nmap

    扫描端口 nmap -v -sS -open -iL iplist.txt -no-stylesheet -oX output.xml -p- -P0 -v 详细信息-sS 隐蔽扫描(半开syn).– ...

  9. 数字对象NSNumber

    //将int类型转化成对象 ; NSNumber *numberString = [NSNumber numberWithInt:number]; //对象是可以放入数组的 NSArray *arra ...

  10. pythonchallenge 解谜 Level 7

    #-*- coding:utf-8 -*- #代码版本均为python 3.5.1 #Level 7 from PIL import Image x_begin, x_end = 0, 609 y_b ...