Excel导入数据库时出现的文本截断问题解决方案
程序员文章站
2022-05-18 08:25:40
问题 在把excel导入到数据库中时,发生文本截断问题:即导入的数据每行只有一部分,原始的excel数据为: 忽略错误 导入sqlse...
问题
在把excel导入到数据库中时,发生文本截断问题:即导入的数据每行只有一部分,原始的excel数据为:
忽略错误
导入sqlserver2008过程中,如果源数据和目标数据类型不匹配会导入失败,所以导入数据时会忽略错误,这次导入题库也是,结果出现了这样的问题:
仔细观察你会发现,题目不完整,最长为25个汉字,很明显这是varchar(50)数据类型,但是源数据和目的数据明明都为文本类型。
不忽略错误
如果不忽略错误,导入数据最后一步会产生这样的问题:
-正在执行(错误)
消息
错误0xc02020c5:数据流任务1:在将列“questioncontent”(33)转换为列“questioncontent”(119)时数据转换失败。转换操作返回状态值4和状态文本“文本被截断,或者一个或多个字符在目标代码页中没有匹配项。”。
(sqlserver导入和导出向导)
错误0xc020902a:数据流任务1:“输出列“questioncontent”(119)”由于发生截断而失败,而且针对“输出列“questioncontent”(119)”的截断行处理设置指定截断时出错。在指定组件的指定对象上出现截断错误。
(sqlserver导入和导出向导)
错误0xc0047022:数据流任务1:ssis错误代码dts_e_processinputfailed。处理输入“数据转换输入”(92)时,组件“数据转换0-0”(91)的processinput方法失败,错误代码为0xc020902a。标识的这个组件从processinput方法返回了一个错误。虽然该错误是此组件特有的,但却是致命的,将导致数据流任务停止运行。可能在此之前已经发出错误消息,提供了有关失败的详细信息。
(sqlserver导入和导出向导)
解决方法
sql语句
可以确定这个问题不是由数据类型不匹配引起,如何解决?既然通过界面方法不能完整导入,可以采用sql语句的方式再试试:
select*into[makesiexam].[dbo].[t_makesi_duoxuanti1]fromopendatasource('microsoft.jet.oledb.4.0',
'datasource=d:/考试系统/题库/2012年下半年马克思考试/马克思_多选题.xls;
extendedproperties=excel8.0')...[sheet1$]
前提
使用sql语句的方法可能会产生两个错误:
sqlserver阻止了对组件'adhocdistributedqueries'的statement'openrowset/opendatasource'的访问,因为此组件已作为此服务器安全配置的一部分而被关闭
消息7399,级别16,状态1,第1行
链接服务器"(null)"的oledb访问接口"microsoft.jet.oledb.4.0"报错。提供程序未给出有关错误的任何信息。
消息7303,级别16,状态1,第1行
无法初始化链接服务器"(null)"的oledb访问接口"microsoft.jet.oledb.4.0"的数据源对象。
解决方法
--启用adhocdistributedqueries
execsp_configure'showadvancedoptions',1
reconfigure
execsp_configure'adhocdistributedqueries',1
reconfigure
第二个问题,是因为excel文件和sqlserver没在同一台机器,把excel放到数据库所在机器上执行上述sql语句即可,注意以上导入数据库的语句需要自建表,表字段数据类型为excel中的数据类型。
导入完毕,可再关闭adhocdistributedqueries
--关闭adhocdistributedqueries
execsp_configure'adhocdistributedqueries',0
reconfigure
execsp_configure'showadvancedoptions',0
reconfigure
导入结果
在把excel导入到数据库中时,发生文本截断问题:即导入的数据每行只有一部分,原始的excel数据为:
忽略错误
导入sqlserver2008过程中,如果源数据和目标数据类型不匹配会导入失败,所以导入数据时会忽略错误,这次导入题库也是,结果出现了这样的问题:
仔细观察你会发现,题目不完整,最长为25个汉字,很明显这是varchar(50)数据类型,但是源数据和目的数据明明都为文本类型。
不忽略错误
如果不忽略错误,导入数据最后一步会产生这样的问题:
复制代码 代码如下:
-正在执行(错误)
消息
错误0xc02020c5:数据流任务1:在将列“questioncontent”(33)转换为列“questioncontent”(119)时数据转换失败。转换操作返回状态值4和状态文本“文本被截断,或者一个或多个字符在目标代码页中没有匹配项。”。
(sqlserver导入和导出向导)
错误0xc020902a:数据流任务1:“输出列“questioncontent”(119)”由于发生截断而失败,而且针对“输出列“questioncontent”(119)”的截断行处理设置指定截断时出错。在指定组件的指定对象上出现截断错误。
(sqlserver导入和导出向导)
错误0xc0047022:数据流任务1:ssis错误代码dts_e_processinputfailed。处理输入“数据转换输入”(92)时,组件“数据转换0-0”(91)的processinput方法失败,错误代码为0xc020902a。标识的这个组件从processinput方法返回了一个错误。虽然该错误是此组件特有的,但却是致命的,将导致数据流任务停止运行。可能在此之前已经发出错误消息,提供了有关失败的详细信息。
(sqlserver导入和导出向导)
解决方法
sql语句
可以确定这个问题不是由数据类型不匹配引起,如何解决?既然通过界面方法不能完整导入,可以采用sql语句的方式再试试:
复制代码 代码如下:
select*into[makesiexam].[dbo].[t_makesi_duoxuanti1]fromopendatasource('microsoft.jet.oledb.4.0',
'datasource=d:/考试系统/题库/2012年下半年马克思考试/马克思_多选题.xls;
extendedproperties=excel8.0')...[sheet1$]
前提
使用sql语句的方法可能会产生两个错误:
复制代码 代码如下:
sqlserver阻止了对组件'adhocdistributedqueries'的statement'openrowset/opendatasource'的访问,因为此组件已作为此服务器安全配置的一部分而被关闭
消息7399,级别16,状态1,第1行
链接服务器"(null)"的oledb访问接口"microsoft.jet.oledb.4.0"报错。提供程序未给出有关错误的任何信息。
消息7303,级别16,状态1,第1行
无法初始化链接服务器"(null)"的oledb访问接口"microsoft.jet.oledb.4.0"的数据源对象。
解决方法
复制代码 代码如下:
--启用adhocdistributedqueries
execsp_configure'showadvancedoptions',1
reconfigure
execsp_configure'adhocdistributedqueries',1
reconfigure
第二个问题,是因为excel文件和sqlserver没在同一台机器,把excel放到数据库所在机器上执行上述sql语句即可,注意以上导入数据库的语句需要自建表,表字段数据类型为excel中的数据类型。
导入完毕,可再关闭adhocdistributedqueries
复制代码 代码如下:
--关闭adhocdistributedqueries
execsp_configure'adhocdistributedqueries',0
reconfigure
execsp_configure'showadvancedoptions',0
reconfigure
导入结果