【www.gdgbn.com--excel】

excel长度超过255个字符导入sql server2005的方法
[excel 源 [1]] 错误: 输出“excel 源输出”(9) 上的 输出列“description 3”(546) 出错。返回的列状态是:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项。”。

该列在excel中最长为308个字符,但是excel源中的外部列和输出列最多只能设为nvarchar(255),如果设定长度超过255,则出现警告,源列属性不匹配,执行也通不过。使用ntext类型也尝试过,不匹配。

我使用ado.net倒是把它倒入到数据库教程了,但是发现所有超过255的都被截断了。

原因分析:

   ado和ssis的excel源对数剧列的长度的判定存在问题。

解决方案一:

      把excel转换成csv格式,然后使用平面文件源导入数据库

      需要注意两点:

      1、输出列长度需要手动修改。

      2、注意不同语言造成的unicode字符转换问题,必要时先切换系统语言,再作转换。

解决方案二:

     将注册表中

jet引擎.
hkey_local_machinesoftwaremicrosoftjet4.0enginesexcel

如果是:ace引擎.
hkey_local_machinesoftwaremicrosoftoffice12.0access connectivity engineenginesexcel

下的typeguessrows 项的值设置为0

windows server 2003 系统注册表中,jet项位于hkey_local_machinesoftwaremicrosoftwow64node下

原因是驱动默认情况下根据列的前8行数据判定列长度,修改为0后需要检查整列数据来判定列长度,超过255个字符默认为ntext格式,少于255个字符则默认为nvarchar(255)。

添加一个数据流.在数据流里.添加一个oledb源.

新建一个excel的oledb源.在这里就不说了.

只需要将provider设置为microsoft ace oledb.然后选择excel文件.

然后设置extended properties属性为excel 12.0;hdr=yes

解决方案三:

         使用函数将长度超过255个字符的列切割为多个少于255的列,导入数据库后在进行合并。

         注意excel的选择性粘贴功能。

        可用函数:left ,mid

经过我测试,通过!

下载注册表文件

select len(convert(varchar(1000),人员分工)),*  from opendatasource( "microsoft.jet.oledb.4.0","data source="c:book1.xls";user id=admin;password=;extended properties=excel 5.0")...[sheet1$]order by len(人员分工) desc--select * from table1
select len(人员分工),* from openrowset("microsoft.jet.oledb.4.0", "excel 8.0;hdr=yes;imex=1;database=c:book1.xls", "select 人员分工,* from [sheet1$]") order by len(人员分工) descselect * from openrowset("microsoft.ace.oledb.12.0", "excel 12.0;hdr=yes;imex=1;database=c:book1.xls", [sheet1$])  order by len(人员分工) desc
select len(人员分工),* from opendatasource("microsoft.ace.oledb.12.0", "data source=c:book1.xls;extended properties="excel 12.0;hdr=yes;imex=0"")...[sheet1$]order by len(人员分工) desc

 

本文来源:http://www.gdgbn.com/bangongshuma/29555/