在进行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的设计,提高转换速度。