在进行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. Centos:Another app is currently holding the yum lock; waiting for it to exit...

    Another app is currently holding the yum lock; waiting for it to exit... 另一个应用程序是:PackageKit 内存: 27 ...

  2. .NET Web开发笔记

    HttpWebRequest HttpWebRequest默认关闭Cookies,给其赋初始值以打开Cookies读写 myRequest.CookieContainer = new CookieCo ...

  3. 配置gradle.properties

    在一些项目中会分拆app 和 lib , 这时候引用support的时候,一旦更改版本会出现需要同步更改两个地方的问题.这种情况,可以通过配置gradle.properties实现替换. 在项目编译过 ...

  4. 【HDU2222】Keywords Search AC自动机

    [HDU2222]Keywords Search Problem Description In the modern time, Search engine came into the life of ...

  5. 从零开始山寨Caffe·伍:Protocol Buffer简易指南

    你为Class外访问private对象而苦恼嘛?你为设计序列化格式而头疼嘛? ——欢迎体验Google Protocol Buffer 面向对象之封装性 历史遗留问题 面向对象中最矛盾的一个特性,就是 ...

  6. MariaDB 主从复制的配置

    一.安装MariaDB 安装过程省略. 二.主从配置 环境     Master/Slave     系统 IP 数据库版本 Master     CentOS6.7         10.10.3. ...

  7. bzoj1024搜索

    进度1/10mark(感觉完不成了) 事实上我刚看到题目一下子慌了,,,我在想怎么二分一块的长宽,然后验证 然而极其难写 于是想有没有暴力,举一些例子模拟一下 然后发现切割是有很明显的限制的:每次切割 ...

  8. bzoj1026数位dp

    基础的数位dp 但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了) #include <bits/stdc++.h> using namespace ...

  9. 我听说 C...

    我听说在 c 语言的世界里,goto 和异常处理都是声名狼藉的东西,而我认为它们在一起就能化解各自的问题.

  10. Python2 基本数据结构源码解析

    Python2 基本数据结构源码解析 Contents 0x00. Preface 0x01. PyObject 0x01. PyIntObject 0x02. PyFloatObject 0x04. ...