开篇介绍

最近经常碰到在 ETL 练习中出现这种转换失败的问题,试了多种方式,同样的代码同样的源结构和表结构但是一直不能成功执行,包报错。一般有这么几种错误:

Error at DST_LOAD_DATA_FROM_FILE [OLE_DST_EMPLOYEE[109]]: The column "FirstName" cannot be processed because more than one code page (1252 and 936) are specified for it.

或者就是

[OLE DB Destination [2]] Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 0x80004005.

An OLE DB record is available.  Source: "Microsoft SQL Server Native Client 11.0"  Hresult: 0x80004005  Description:

"OLE DB provider 'STREAM' for linked server '(null)' returned invalid data for column '[!BulkInsert] .FirstName'.".

那么这些问题是如何造成的呢?

不一致的字符集

这些错误与两方面因素有关,一方面是数据源,一方面是目标表。

在我们的测试案例文件中,源案例文件中包含有一些西欧字符,西欧拉丁字符集就是 1252。而我们有些测试环境下目标数据库中的字符集是 GBK - 表示简体中文,那么这种转换要么就是转换失败,要么就是转换成功但是显示为乱码。

下图是我们的源文件中的西欧拉丁字符,这种字符是无法存储在 GBK 字符集格式下的数据库中的,强行存储就是一个乱码。

右键查看我们的目标表,如果它的 Collation 是 SQL_Latin1_General_CP1_CI_AS 的话这种文件数据加到对应的表中是没有任何问题的。

但是如果是这样的 Collation 就会出现错误。

错误还原

创建数据流 Data Flow Task 并设置文件数据源和目标表对象(Collation = Chinese_PRC_CI_AS),文件连接管理器中的 Locale 是英语,Code Page 是 1252。

已经可以看到报错信息了:

The column "FirstName" cannot be processed because more than one code page (1252 and 936) are specified....

如果强制执行,就会看到这种信息:

Error at DST_OAD_DATA_FROM_FILE [OLE_DST_EMPLOYEE[109]]: The column "FirstName" cannot be processed because more than one code page (1252 and 936) are specified for it.

Error at DST_LOAD_DATA_FROM_FILE [OLE_DST_EMPLOYEE[109]]: The column "FirstName" cannot be processed because more than one code page (1252 and 936) are specified for it.

错误的原因在于数据流 DST_LOAD_DATA_FROM_FILE 中的数据流控件 OLE_DST_EMPOYEE 即 OLE DB Destination 目标控件中的列有多于一个以上的 Code Page 1252 和 936。 很显然 1252 指的是自动识别到的文件数据源中的字符集是拉丁西欧字符 1252, 而 936 则表示我们目标表中的字符格式。目标控件不知道如何选择哪一种字符集来处理,不统一就无法处理。

我们将文件链接管理器中的 Locale 改成简体中文 Chinese Simplified, Code Page 自动变为 936 GBK 类型。

这时的包编辑通过。

但执行再次报错。

错误原因:

[OLE DB Destination [2]] Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 0x80004005.

An OLE DB record is available.  Source: "Microsoft SQL Server Native Client 11.0"  Hresult: 0x80004005  Description:

"OLE DB provider 'STREAM' for linked server '(null)' returned invalid data for column '[!BulkInsert] .FirstName'.".

注意到错误最后有一个 Bulk Insert 的插入方式,提示了我们在 OLE_DST_EMPLOYEE 控件中使用的是 Bulk Insert 的插入方式。Bulk Insert 又称之为数据拷贝,速度和效率都很高,但是在 Bulk Insert 的过程中是不考虑字符转换的,如果字符不能完成相应的转换,一旦无法存储就会发生报错。

可以想一想,我们的源文件中的拉丁西欧字符是无法转换成对应的 GBK 简体中文的,所以在 OLE_DST_EMPLOYEE 中一定采用了 Bulk Insert 的方式,并且由于没有字符转换这一过程,GBK 的数据类型是无法保存这种西欧拉丁字符的。

为什么是 Bulk Insert 的方式,可以看看 OLE_DST_EMPLOYEE 就明白了,这里采用的是 Table or View - Fast Load 的模式。 Fast Load 只所以效率高,是因为它采用的就是 Bulk Insert 这种方式。

这也就是很多同学将 Table or view - Fast Load 改为 Table or view 就不会发生执行失败的原因。因为在普通的 Table or view 的加载模式下,这种字符类型会强制的变为 GBK 可接受的数据格式。

执行成功了。

但是到数据库中查查就会发现这个西欧字符实际上是没有转换成功的,变成了乱码。而这个乱码是不受我们控制的,因为目标数据库,表的 Collation 就是 GBK 格式。

Code Page 的相关文章

什么是 Code Page

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)  如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。

微软BI 之SSIS 系列 - ETL 转换时关于 Code Page (1252 and 936) 转换错误的原因和解决方法的更多相关文章

  1. 微软BI 之SSIS 系列 - 使用 Script Component Destination 和 ADO.NET 解析不规则文件并插入数据

    开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中 ...

  2. 微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件

    原文:微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件 开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent ...

  3. 微软BI 之SSIS 系列 - 再谈Lookup 缓存

    开篇介绍 关于 Lookup 的缓存其实在之前的一篇文章中已经提到了 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache ...

  4. 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug

    开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配 ...

  5. 微软BI 之SSIS 系列 - Lookup 中的字符串比较大小写处理 Case Sensitive or Insensitive

    开篇介绍 前几天碰到这样的一个问题,在 Lookup 中如何设置大小写不敏感比较,即如何在 Lookup 中的字符串比较时不区分大小写? 实际上就这个问题已经有很多人提给微软了,但是得到的结果就是 C ...

  6. 微软BI 之SSIS 系列 - 在 SSIS 中导入 ACCESS 数据库中的数据

    开篇介绍 来自 天善学院 一个学员的问题,如何在 SSIS 中导入 ACCESS 数据表中的数据. 在 SSIS 中导入 ACCESS 数据库数据 ACCESS 实际上是一个轻量级的桌面数据库,直接使 ...

  7. 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式

    开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型 ...

  8. 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧

    案例背景与需求介绍 之前做过一个美国的医疗保险的项目,保险提供商有大量的文件需要发送给比如像银行,医疗协会,第三方服务商等.比如像与银行交互的 ACH 文件,传送给协会的 ACH Credit 等文件 ...

  9. 微软BI 之SSIS 系列 - XML Task 中XSLT 样式表转换错误记录

    开篇介绍 此文章专门记录 XSLT 样式表转换过程中的语法问题 错误一 值与属性的倒置 修改了几次样式表,但还是一如既往的报错,报错信息如下: [XML Task] Error: An error o ...

随机推荐

  1. MySQL的备份的一些策略和方法的总结

    1.一般使用的是mysqldump来进行备份,每次dump的数据是1000条,并且在这个过程中会进行锁表. (这种方式是逻辑备份,即直接将数据库中的数据导成sql语句进行备份的过程) 主要的使用方法: ...

  2. XidianOJ 1183 Water Problem: Items divided

    题目描述 Youyouyouyou is very interested in math, one day, an idea came into his mind that how many ways ...

  3. angular笔记

    /** * Created by Administrator on 2016/5/3 0003. */ ng-app是告诉angularjs编译器把该元素当作编译的根 //定义模块 var myApp ...

  4. Web前端之CSS_day1-2

    1.div和span div的语义是division“分割”: span的语义就是span“范围.跨度” div标签是一个容器级标签,里面什么都能放,甚至可以放div自己 span是一个“文本级”的标 ...

  5. GsonWithoutObject 没有对象(脱离对象) 直接提取 ... gson json

    GsonWithoutObject 脱离对象, 直接提取 package temp; import tool.FileTool; import com.google.gson.JsonElement; ...

  6. RHEL7网络管理之nmcli

    在RHEL7中默认使用NetworkManager 守护进程来监控和管理网络设置.nmcli是命令行的管理NetworkManager的工具,会自动把配置写到/etc/sysconfig/networ ...

  7. Windows CMD命令大全【转】

    命令简介 cmd是command的缩写.即命令行 . 虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在使用,所以一 ...

  8. hdu 3254 (状压DP) Corn Fields

    poj 3254 n乘m的矩阵,1表示这块区域可以放牛,0,表示不能,而且不能在相邻的(包括上下相邻)两个区域放牛,问有多少种放牛的方法,全部不放也是一种方法. 对于每块可以放牛的区域,有放或者不放两 ...

  9. 在UITableViewStylePlain情况下sectionHeader可以与tableview一起滑动的解决方法

    -(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat sectionHeaderHeight = ; ) { scrollVi ...

  10. mvc深入理解

    对于v和c好理解, 对于model分为数据对象模型和业务逻辑模型,一般为一个类,数据对象模型包含对一个具体数据表的相关操作,业务逻辑模型为处理一些业务逻辑.