在进行ETL开发时,数据类型(Data Type)是最基础的,但也容易被忽略,楼主使用的SQL Server 版本是2012,用此博文记录,常用的SSIS数据类型和TSQL数据类型的映射。SSIS的数据类型,是指数据流组件使用的数据类型和变量的数据类型(Data Flow 和 Variable)。

当数据进入Package的data flow task中时,SSIS 通过数据源组件从数据源抽取(extract)数据,获取元数据类型,并转换成SSIS支持的数据类型,SSIS的数据类型主要分为三类:字符(string),数值(numeric)和日期/时间(date/time),如果源数据类似不能转换成相应的SSIS 数据类型,SSIS Engine就会报错。SSIS的数据类型,以“DT_”开头,是Data Type的简写。

一,SSIS 数据流的数据类型和TSQL数据类型的映射

1,字符类型

字符类型用于存储字符串,在SQL Server中,使用单引号表示一个字符,但是在SSIS中,使用双引号表示一个字符串。

SSIS的字符类型和TSQL的数据类型的对应关系:

  • DT_STR:对应TSQL的 varchar, char
  • DT_WSTR:对应TSQL的 nchar, nvarchar, xml

2,数值类型

数值类型分为整数和小数,SSIS的整数类型和TSQL数据类型的对应关系:

  • DT_BOOL:bit
  • DT_UI1:tinyint,占用一个字节,非负整数,数值范围是:0-255
  • DT_I2:smallint,占用2个字节,有符号整数
  • DT_I4:int,占用4个字节,有符号整数
  • DT_I8:bigint,占用8个字节,有符号整数
  • DT_BYTES:binary, varbinary, RowVersion

TSQL的小数数值类型分为两类:精确小数(decimal)和近似小数(float),小数也叫实数(real),SSIS的小数类型和TSQL数据类型的对应关系:

  • DT_NUMERIC:精确小数,decimal
  • DT_R4:近似小数,float(24)
  • DT_R8:近似小数,float(53)

3,日期时间类型

SSIS的日期时间类型和TSQL数据类型的对应关系:

  • DT_DBDATE:date
  • DT_DBTIME2:time(p)
  • DT_DBTIMESTAMP:datetime
  • DT_DBTIMESTAMP2:datetime2

SSIS 内置函数:GETDATE() 和 GETUTCDATE() 返回值的数据类型是DT_DBTIMESTAMP,对应TSQL的DateTime,因此,只保留3位毫秒。在Expression Builder中,将时间类型转换成字符串类型,显示的毫秒数有效数值只有3位,末尾补6个0,共9位:

  • (DT_WSTR,30) GETDATE(),Evaluated Value是:2016-10-13 17:04:01.765000000
  • (DT_DBTIMESTAMP2,7) GETDATE(),Evaluated Value是:10/13/2016 5:01:54 PM

二,SSIS 变量(Variable)的数据类型和TSQL数据类型的映射

SSIS 变量的数据类型,不同于SSIS的数据类型,但都和SSIS的数据类型相兼容,在进行表达式求值时,SSIS自动将变量的数据类型隐式转换成SSIS的数据类型,然后进行求值。

Variables have a Variant data type and the expression evaluator converts the data type of a variable from a Variant subtype to an Integration Services data type before it evaluates the expression.

1,字符数据类型

字符变量和TSQL数据类型的映射关系:

  • String:char,nchar,varchar(n),nvarchar(n)
  • object:varchar(max),nvarchar(max)

2,数值类型

数值类型的变量和TSQL数据类型的映射关系:

  • Boolean:bit
  • Int64:bigint
  • Int32:int
  • Int16:smallint
  • Byte:tinyint
  • object:binary, varbinary(n), varbinary(max)
  • 精确小数:Decimal 在SQL Server 2012以后,对应TSQL的decimal
  • 近似小数:Single 对应TSQL的float(24),  Double 对应TSQL的float(53)

3,日期/时间类型

日期/时间类型的变量和TSQL数据类型的映射关系:

  • DateTime:对应TSQL的datetime
  • Object:对应TSQL的time,date,datetime2

三,强制类型转换

SSIS在进行表达式求值时,自动将一个数据类型隐式转换成相兼容的另外一个数据类型,如果类型不兼容,必须强制类型转换,否则,SSIS报错。对数据进行强制类型转换的格式是:(type) expression,在进行显式类型转换时,尽量使用窄的数据类型,这样能够提高数据传输的速度;但是,数据转换需要付出一定的代价,因此,必须权衡类型转换和数据传输对性能的影响。

An implicit conversion of a data type occurs when the expression evaluator automatically converts the data from one data type to another. If the data in a column does not require the full width allocated by the source data type, you might want to change the data type of the column. Making each data row as narrow as possible helps optimize performance when transferring data because the narrower each row is, the faster the data is moved from source to destination.

1,将字符串转换成TSQL的日期/时间类型

在SSIS中,字符串常量使用双引号“”,[] 表示可选:

  • 转换成date:(DT_DBDATE)"yyyy-mm-dd"
  • 转换成time(n):(DT_DBTIME2,n)"hh:mm:ss[.fffffff]"
  • 转换成datetime:(DT_DBTIMESTAMP)"yyyy-mm-dd hh:mm:ss[.fff]"
  • 转换成datetime2(n):(DT_DBTIMESTAMP2,n)"yyyy-mm-dd hh:mm:ss[.fffffff]"

2,转换成字符串

字符串分为双字节字符和单字节字符,对于单字节字符,SSIS使用 DT_STR 表示,在强制类型转换时,必须制定code page和字符长度:

  • 将整数5转换为单字节字符:(DT_STR,30,1252)5
  • 将整数5转换为双字节字符:(DT_WSTR,30)5
  • 将 DT_DBTIMESTAMP 类型转换成字符串:(DT_WSTR,30)GETDATE(),返回的数据格式是: 2016-10-13 14:55:31.248000000,GETDATE()返回的数据类型是DT_DBTIMESTAMP;

3,数值类型转换

  • 将字符串转换成bit:(DT_BOOL)"True"
  • 将小数转换成int:(DT_I4) 3.57
  • 将整数转化成精确小数:(DT_NUMERIC,7,3)4000

四,数据类型转换的性能

将数据从一个SQL Server 加载到另一个SQL Server之前,如果需要转换数据类型,建议使用TSQL Conversion,这样,能简化Package的设计,提高转换速度。

五,参数的数据类型

在Execute SQL Task引用变量时,必须在Parameter Mapping Tab中设置参数的Data Type,请参考《Execute SQL Task 参数和变量的映射

参考文档:

Integration Services (SSIS) Expressions

Cast (SSIS Expression)

Integration Services Data Types

SQL Server Integration Services, Data Type Mapping

Performance Comparison between Data Type Conversion Techniques in SSIS 2008

SSIS 数据类型和类型转换的更多相关文章

  1. java与.net比较学习系列(3) 基本数据类型和类型转换

    在Java中,数据类型分为两类,一类是基本数据类型,另外一类是引用类型. 而在C#中,数据类型分为三类,分别是基元类型,值类型和引用类型.其中基元类型是.net framework框架中预定义的类型, ...

  2. 【转】java与.net比较学习系列(3) 基本数据类型和类型转换

    原文地址:https://www.cnblogs.com/mcgrady/p/3397874.html 阅读目录 一,整数类型 二,浮点数类型 三,字符类型 四,布尔类型 五,类型转换之自动转换 六, ...

  3. 大数据学习--day02(标识符、变量、数据类型、类型转换、进制转换、原码反码补码)

    标识符.变量.数据类型.类型转换.进制转换.原码反码补码 标识符: java50个关键字不能做标识符,以数字开头不能做标识符(这个老是忘记写一个类名的时候) 变量: 变量分为成员变量和局部变量,注意作 ...

  4. python入门4 python查看数据类型及类型转换

    查看数据类型:type() 类型转换:int(),float(),char(),ord(),str(),bool() #coding:utf-8 #/usr/bin/python "&quo ...

  5. 【Python系统学习02】数据类型与类型转换

    一.数据类型 字符串 整数 浮点数 [补充中...] 1.字符串 str 字符串:英文string,简写str. name = '小石头:' print(name,'2019', '12', '24' ...

  6. 2 JavaScript输出&字面量&变量&操作符&语句&标识符和关键字&字符集&语句&数据类型与类型转换

    JS输出: JavaScript没有任何打印或者输出的函数,但是可以用不同的方式输出数据 window.alert():弹出警告框 document.write():写入文档 innerHTML:写入 ...

  7. 02-JS中的数据类型及类型转换

    02-JS中的数据类型及类型转换 一.数据类型 JS中的值,无论是字面量还是变量,都有明确的类型. (一)概述 1.基本类型5种 number 数字类型 string 字符串类型 boolean 布尔 ...

  8. 数据类型/强制类型转换 和运算符---标识符规则/关键字 a++和++a区别

    3.2关键字都是小写,TRUE FALSE NULL都不是Java关键字 3.3数据类型 变量相当于一个有名称的容器,该容器用于装各种不同类型的数据 Java类型分为2种 基本类型: 引用类型: 基本 ...

  9. .net学习之.net和C#关系、运行过程、数据类型、类型转换、值类型和引用类型、数组以及方法参数等

    1..net 和 C# 的关系.net 是一个平台,C#是种语言,C#语言可以通过.net平台来编写.部署.运行.net应用程序,C#通过.net平台开发.net应用程序2..net平台的重要组成FC ...

随机推荐

  1. java中注解的使用与实例 (二)

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  2. SOAPUI使用教程-REST服务和WADL

    首先创建一个新的REST项目: 选择文件|新建项目REST从主菜单: 通常情况下,我们可能会只提供一个URI 点击导入消耗. 在新建项目消耗对话框: 点击浏览. 然后,我们可以浏览到该文件: 点击   ...

  3. android开发中使不同的listview同时联动

    在做一个Android程序时,需要在一个屏幕上显示两个不同的listview,开始用< linearlayout>包裹这两个listview在<ScrollView >设置时, ...

  4. webview使用技巧汇总

    1.webview去除原网址的广告或者标题 js语句 document.documentElement.getElementsByClassName('这里写你要消除的空间的class里面的字符串') ...

  5. JAVA中使用DOM解析XML文件

    XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...

  6. STM32之通用定时器

    广大的互联网的大家早上中午晚上..又好..没错了..我又来了..写博客不是定时的..为什么我要提写博客不是定时的呢??聪明的人又猜到我要说什么了吧.有前途.其实我还是第一次听到定时器有通用和高级之分的 ...

  7. 关于“模仿"和”创新“

    互联网刚刚进入中国的前10年,国内互联网企业基本处于模仿和学习阶段.三大门户新浪.搜狐和网易,师从雅虎:现在如日中天的BAT三巨头,百度学习谷歌.阿里巴巴学习亚马逊和EBAY.腾讯学习ICQ. 关于模 ...

  8. CentOS7 SWAP 设置 (实测 笔记)

    首先查看当前的内存及swap情况(参数 -h,-m ) [root@centos ~]# free -h 查看swap信息,包括文件和分区的详细信息 [root@centos ~]# swapon - ...

  9. Ubuntu 14.04--php的安装和配置

      更新源列表 打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入root用户的密码"--& ...

  10. 通过修改i8042prt端口驱动中类驱动Kbdclass的回调函数地址,达到过滤键盘操作的例子

    同样也是寒江独钓的例子,但只给了思路,现贴出实现代码 原理是通过改变端口驱动中本该调用类驱动回调函数的地方下手 //替换分发函数 来实现过滤 #include <wdm.h> #inclu ...