当前位置: 首页 > news >正文

SSIS 数据类型和类型转换

在进行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

作者: 悦光阴
出处: http://www.cnblogs.com/ljhdo/
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
分类: SSIS





本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/5174681.html,如需转载请自行联系原作者

相关文章:

  • Vue,列表展示。多个字段拼接展示
  • Swift开发:NSLayoutConstraint纯代码实现自动布局-初级篇
  • react中的 Modal.confirm
  • 数据挖掘之决策树ID3算法(C#实现)
  • 【一小时入门】webpack 入门指南
  • Vue中 beforeRouteLeave离开路由之前要执行的操作
  • AF3.1.0简单二次封装
  • Vue 项目中 根目录中router路由拦截 beforeEach 常用的写法
  • 不同按钮模板自定义
  • react项目中没有路由守卫,需要拦截的话,只能在路径上拦截,可以自己去封装 Route
  • 跟锦数学160823-190322, 共 942 题
  • JavaScript新鲜事·第5期
  • vue 项目实战 递归
  • react 项目 tab列表 把返回的一个字段数组,全部 展示在一个字段里
  • Python语言学习 (六)1.2
  • #Java异常处理
  • [数据结构]链表的实现在PHP中
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Consul Config 使用Git做版本控制的实现
  • cookie和session
  • HTTP--网络协议分层,http历史(二)
  • js ES6 求数组的交集,并集,还有差集
  • react-native 安卓真机环境搭建
  • ReactNative开发常用的三方模块
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 编写符合Python风格的对象
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 多线程事务回滚
  • 高度不固定时垂直居中
  • 基于 Babel 的 npm 包最小化设置
  • 记录:CentOS7.2配置LNMP环境记录
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 学习ES6 变量的解构赋值
  • 学习使用ExpressJS 4.0中的新Router
  • 找一份好的前端工作,起点很重要
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • ​【已解决】npm install​卡主不动的情况
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #预处理和函数的对比以及条件编译
  • (1)SpringCloud 整合Python
  • (4)logging(日志模块)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Forward) Music Player: From UI Proposal to Code
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (九)信息融合方式简介
  • (学习日记)2024.01.09
  • (一)appium-desktop定位元素原理
  • (一)Mocha源码阅读: 项目结构及命令行启动