SQL SERVER 导入 EXCEL “文本被截断,或者一个或多个字符在目标代码页中没有匹配项”

时间:2021-11-08 09:34:00

我先描述一下我遇到的问题:

    系统windows server 2008 + SQL server 2008,32位和64位我都遇到同样的问题,所以,不存在32位问题还是64位的问题。

    office 是2003 (2003及以下版本都一样)

 

    常规导入:右击数据库→任务→导入数据……结果出现截断的情况!仔细观察,可以容纳2000个字的字段怎么几百字都容纳不下?后来觉得是内容中有回车换行,那就百度“如何替换excel中的回车换行”,结果还是不行。

    后来,我把那个字段text改为nvarchar(max),症状有所减轻,起码下边我分批导入可以导

    于是,我分批导入数据,看是哪行数据有问题!结果,惊奇发现:全导进去了!!问题是,明明那几十行全部导入就有上述截断问题,分批导入,每10行导入完全没有问题。一次性导入就提示截断。

 

    关于上述这个问题,已经排除了回车换行等可能出现的错误,也排除了字段不够容纳excel内容的错误了!

    无论我费多大劲,各种百度,各种请教人,怎么改都无济于事!最后,慢慢的找到解决的方法:

 

    利用SQL语句导入:

  ******************************************************
装完windows server系统,别急着先装office,先装:(当然,如果你装的是office 2007及以上版本,那可以省略这一步)
 32位系统下载AccessDatabaseEngine.exe来安装
 64位系统下载AccessDatabaseEngine_X64.exe来安装
下载地址:
http://www.baidu.com/s?wd=AccessDatabaseEngine_X64下载&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_n=2&rsv_sug3=1&rsv_sug1=1&rsv_sug4=63&inputT=2964

    再装office 2003及以下版本的办公软件。

然后导入数据直接用下列SQL语句,选好数据库:(前提,excel里边的字段要和表里边的字段一一对应)
INSERT INTO 表名 SELECT * FROM OPENROWSET('MICROSOFT.ACE.OLEDB.12.0','Excel5.0;HDR=YES;DATABASE=g:\老客户资料.xls',结果$)

解说一下,上边的SQL语句是连接在一起的;G:\老客户资料.xls是你要导入的excel的路径;结果 是你excel里边左下角有数据的选项卡的名字。其他地方不要改动。

基本上可以导入了!还会出现截断的错误,那就是其他列真有溢出。回答结束
******************************************************

一般我们导入数据,直接就是右击数据库→导入,然后选择excel,然后选择相应的表直接导入

我就是通过上述这常规方法导入,出错!结果一条一条排查,最后发现:每10条导一次是可以全部导入的,包括我们认为可能错误的行数都可以正确输入,但10条10条的导入,数据多了,你就死了!

 

 

然后运行下边SQL语句:

INSERT INTO zsb_customer SELECT * FROM OPENROWSET('MICROSOFT.Jet.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=g:\老客户资料.xls',结果$)

其中《老客户资料》就是你要导入的excel名

 一:如果不行,就加这个:(我还没出现过这个错误,我是出现第二个错误)

 执行以下语句:

 exec sp_configure 'show advanced options',1
 reconfigure
 exec sp_configure 'Ad Hoc Distributed Queries',1
 reconfigure

 再执行:
 INSERT INTO zsb_customer SELECT * FROM OPENROWSET('MICROSOFT.Jet.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=g:\老客户资料 .xls',结果$)

 再执行:
 exec sp_configure 'Ad Hoc Distributed Queries',0
 reconfigure
 exec sp_configure 'show advanced options',0
 reconfigure

 二:如果是出现这错误:
 因为 OLE DB 访问接口 'MICROSOFT.Jet.OLEDB.4.0' 配置为在单线程单元模式下运行
 那么你应该是装了office 2003或者以下版本

 解决步骤:把office 2003卸载干净!
 32位系统下载AccessDatabaseEngine.exe来安装
 64位系统下载AccessDatabaseEngine_X64.exe来安装

 然后再安装回你的office版本。

 然后执行SQL语句:(同上边语句的区别在:Jet改为ACE;4.0改为12.0)
INSERT INTO zsb_customer SELECT * FROM OPENROWSET('MICROSOFT.ACE.OLEDB.12.0','Excel 5.0;HDR=YES;DATABASE=g:\老客户资料.xls',结果$)

 

 

 

 

消息 7308,级别 16,状态 1,第 1 行
因为 OLE DB 访问接口 'MICROSOFT.JET.OLEDB.4.0' 配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询。