分享

用SQL语句导入excel数据

 qrzhcd 2013-11-19
今天,我的Team Leader让load一些数据到数据库中去,之前这样的事情我也做过。没有遇到过什么错误,但是今天这个excel让我吃了不少苦头。经过我不懈努力,最终解决了所有问题,顺利完成任务。下面我把我遇到的问题写下来和大家探讨一下。

一、问题提出

这个excel大概1W条数据,数据量不是很大,开始导入也很顺利。不到一分钟就完成了,结果我发现有一列数据全部变成了null,并且其他列的数据格式也不正确。然后我就更改了每个列的数据类型,结果导致数据无法导入。郁闷!

二、问题深化

于是我想到用SQL语句去试一下,用下面的语句执行了一下。
  1. SELECT * 
  2. FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
  3. 'Excel 8.0;HDR=YES;imex=1;Database=\\surrey-test\GS\GS_UNpaid.xls',
  4. 'SELECT * FROM [Sheet1$]')
复制代码
结果出现,OLE DB 提供程序 'Microsoft.Jet.OLEDB.4.0' 不包含表 'Sheet1$'。该表可能不存在,或当前用户没有使用该表的权限。

OLE DB 错误跟踪[Non-interface error: OLE DB provider does not contain the table: ProviderName='Microsoft.Jet.OLEDB.4.0', TableName='Sheet1$']。

于是,详细思考了一下。哦,原来我的excel没有放到Server上,放上去之后在此运行,数据查出来了。

三、设法解决

数据查出来之后格式依然不正确,不符合我们的要求,于是开始进行数据格式的转换。开始的时候使用convert和cast把数据转换为float类型,不行。于是再次转换convert(float,convert(varchar(50),isnull(gs_guid,0))),这次格式对了,但是数据却由于float类型的精度问题而发生了改变,不能满足要求。于是使用
left(cast(cast(convert(float,convert(varchar(20),confirmation_no)) as decimal(20,7)) as varchar(20)),9),结果还是不能让人满意,数据失真了。苦思冥想,终于想到这条cast(cast(confirmation_no as decimal) as varchar),Ok。问题解决,欣喜若狂。

四、检查问题

就在我要Submit的时候,却发现一个致命的问题,所有数据格式正确的同时,竟然有一列数据发生了很大变化,于是认真查找,发现了问题的存在,对于这一列使用cast(convert(bigint,convert(float,convert(varchar(50),isnull(gs_guid,0))))as varchar),问题终于搞定。

五、问题解决

最后使用
  1. INSERT INTO temp4
  2. select convert(char(4),car_no) as car_no,convert(datetime,[column name]) as pu_date,
  3. cast(cast([column name] as decimal) as varchar),
  4. --left(cast(cast(convert(float(5),convert(varchar(50),[column name])) as decimal(20,7)) as varchar(20)),10),
  5. convert(decimal(12,2),[column name]),convert(char(4),dr_no),
  6. cast(cast([column name]as decimal) as varchar),
  7. cast(cast([column name] as decimal) as varchar),
  8. --convert(float,convert(varchar(50),isnull([column name],0))),
  9. cast(convert(bigint,convert(float,convert(varchar(50),isnull([column name],0))))as varchar),
  10. cast(cast([column name]as decimal) as varchar),
  11. --left(cast(cast(convert(float,convert(varchar(20),[column name])) as decimal(20,7)) as varchar(20)),10),
  12. --left(cast(cast(convert(float,convert(varchar(20),[column name])) as decimal(20,7)) as varchar(20)),9),
  13. --left(cast(cast( convert(float,convert(varchar(50),isnull([column name],0))) as decimal(20,7)) as varchar(20)),9),
  14. --left(cast(convert(float,convert(char(20),[column name])) as varchar(20)),6),
  15. convert(datetime,[column name]) ,isnull([column name],'')
  16. FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
  17. 'Excel 8.0;HDR=YES;imex=1;Database=\\surrey-test\GS\GS_UNpaid.xls',
  18. 'SELECT * FROM [gs_voucher_notpaid$]')
复制代码
将数据load到Database中去。

六、总结

导入数据虽然是件很简单的事情,但是这里面还是包含了很多知识。比如数据的存储类型,数据库中的一些常用函数,等等。希望,这些经验能够使我在项目中受益,同时也希望各位多多指点。(文/语虫

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多