在使用SQL SERVER将EXCEL导入到数据库中的时候.经常会发生一些问题.会让我们有些感觉到莫名其妙.
今天在论坛上.一个朋友在使用SSIS将EXCEL导入到SQL SERVER的数据库内的时候.发生了这个错误:
Excel 源 [1]] 错误: 输出“Excel 源输出”(9) 上的输出列“Description 3”(546) 出错。返回的列状态是:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项。”。
据他的描述是这样子的:
该列在excel中最长为308个字符,但是excel源中的外部列和输出列最多只能设为Nvarchar(255),如果设定长度超过255,则出现警告,源列属性不匹配,执行也通不过。使用Ntext类型也尝试过,不匹配。
我们来分析一下.出现这个错误可能的原因是:默认情况下..JET引擎或ACE引擎它会抽取EXCEL工作表中的前8行记录来解释每个列的数据类型.如果字符型的占这8行的比例多.那就会解释为字符类型.而且如果这8行记录中.如果长度少于或等于255的.那就会解释为nvarchar(255),否则会解释为ntext
为了验证这一点.我们来做一个测试:
在这个Excel的工作表当中.A17的内容远远超过255个字符.
我们现在需要将这个工作表的数据导入到数据库当中.
我们先在SQL SERVER上建一个表.
CREATE TABLE tb(name ntext,sex nvarchar(255))
然后打开SSIS.并添加一个数据流.在数据流里.添加一个OLEDB源.
新建一个excel的oledb源.在这里就不说了.
只需要将Provider设置为Microsoft Ace Oledb.然后选择Excel文件.
然后设置Extended Properties属性为Excel 12.0;HDR=YES
即可.
设置如下.
然后切换到”列”中.选择name和sex两个列.
然后确定.以完成OleDB源的设置.
但是这时候要注意的是.这时.ACE引擎会给我们把name解释成什么类型呢?.
我们右击这个OLEDB源.进入”高级编辑器”.然后在”输入和输出”当中.看看输入列中name的类型.
我们看到.引擎给我们把name列的类型解释为DT_WSTR.并且Length是255.
但是我们显然有记录的长度远远超过255.
如果这时候.运行一下.
那么就会出错.
然后在进程选项卡当中.我们可以看到一个跟开始一样的错误.
“文本被截断,或者一个或多个字符在目标代码页中没有匹配项。”
如果此时,我们将注册表中
Jet引擎.
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel
如果是:ACE引擎.
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/12.0/Access Connectivity Engine/Engines/Excel
下的TypeGuessRows 项的值设置为0
再SSIS中.重新设置一个OLEDB源.那么现在再右击OLEDB源.在”高级编辑器”中看看列的类型.
可以看到类型已经自动识别为ntext了.
OK,现在再加上SQL SERVER的目标.即可.
帖子URL : http://topic.youkuaiyun.com/u/20090915/11/7c9a964f-af59-4ab6-8655-77b4c4c657ab.html?17126