该列在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