设为首页 收藏本站
查看: 627|回复: 0

[经验分享] SQL 读取Excel

[复制链接]

尚未签到

发表于 2018-10-18 11:45:49 | 显示全部楼层 |阅读模式
  一、数据库读取Excel文件
SQL Server 2000 中的列顺序问题这是 SQL Server 2000 行集函数 OpenRowSet 和 OpenDataSource 本身的问题,与访问接口引擎无关,也与 Excel 版本无关。SQL Server 2005 的 OpenRowSet 和 OpenDataSource 不存在这个问题。   上图是 Sheet3 的内容,连接到 SQL Server 2000 测试看看是什么问题: view plaincopy to clipboardprint?--> HDR=Yes    select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;Database=D:\97-2003.xls', [Sheet3$])    select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;Database=D:\97-2003.xls')...[Sheet3$]    select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Data Source=D:\2007.xlsx;Extended Properties="Excel 12.0;HDR=Yes"')...[Sheet3$]    /*    A    B    C    D    E    F    G    H    I    J    --- --- --- --- --- --- --- --- --- ---    C10 C9   C8   C7   C6   C5   C4   C3   C2   C1    */       --> HDR=No    select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=No;Database=D:\97-2003.xls', [Sheet3$])    select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=No;Database=D:\97-2003.xls')...[Sheet3$]    select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Data Source=D:\2007.xlsx;Extended Properties="Excel 12.0;HDR=No"')...[Sheet3$]    /*    F1   F10 F2   F3   F4   F5   F6   F7   F8   F9    --- --- --- --- --- --- --- --- --- ---    J    A    I    H    G    F    E    D    C    B    C1   C10 C2   C3   C4   C5   C6   C7   C8   C9    */    --> HDR=Yesselect * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;Database=D:\97-2003.xls', [Sheet3$])select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;Database=D:\97-2003.xls')...[Sheet3$]select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Data Source=D:\2007.xlsx;Extended Properties="Excel 12.0;HDR=Yes"')...[Sheet3$]/*A   B   C   D   E   F   G   H   I   J--- --- --- --- --- --- --- --- --- ---C10 C9  C8  C7  C6  C5  C4  C3  C2  C1*/ --> HDR=Noselect * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=No;Database=D:\97-2003.xls', [Sheet3$])select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=No;Database=D:\97-2003.xls')...[Sheet3$]select * from OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Data Source=D:\2007.xlsx;Extended Properties="Excel 12.0;HDR=No"')...[Sheet3$]/*F1  F10 F2  F3  F4  F5  F6  F7  F8  F9--- --- --- --- --- --- --- --- --- ---J   A   I   H   G   F   E   D   C   BC1  C10 C2  C3  C4  C5  C6  C7  C8  C9*/返回结果集的列顺序,是按照列名排序,并不是 Excel 表的列顺序。HDR=No 貌似正确,但仔细一看,仍然是按列名排序的。  OpenRowSet(query) OpenRowSet(query) 可以解决这个列顺序的问题,包括后面的访问隐藏的 Sheet 或非常规命名的 Sheet,都可以用 OpenRowSet(query) 解决。 view plaincopy to clipboardprint?--> HDR=Yes    select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;Database=D:\97-2003.xls', 'select * from [Sheet3$]')    select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;Database=D:\97-2003.xls', 'select * from [Sheet3$]')    select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;Database=D:\2007.xlsx', 'select * from [Sheet3$]')    /*    J    I    H    G    F    E    D    C    B    A    --- --- --- --- --- --- --- --- --- ---    C1   C2   C3   C4   C5   C6   C7   C8   C9   C10    */       --> HDR=No    select * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=No;Database=D:\97-2003.xls', 'select * from [Sheet3$]')    select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=No;Database=D:\97-2003.xls', 'select * from [Sheet3$]')    select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=No;Database=D:\2007.xlsx', 'select * from [Sheet3$]')    /*    F1   F2   F3   F4   F5   F6   F7   F8   F9   F10    --- --- --- --- --- --- --- --- --- ---    J    I    H    G    F    E    D    C    B    A    C1   C2   C3   C4   C5   C6   C7   C8   C9   C10    */    --> HDR=Yesselect * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=Yes;Database=D:\97-2003.xls', 'select * from [Sheet3$]')select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;Database=D:\97-2003.xls', 'select * from [Sheet3$]')select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;Database=D:\2007.xlsx', 'select * from [Sheet3$]')/*J   I   H   G   F   E   D   C   B   A--- --- --- --- --- --- --- --- --- ---C1  C2  C3  C4  C5  C6  C7  C8  C9  C10*/ --> HDR=Noselect * from OpenRowSet('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;HDR=No;Database=D:\97-2003.xls', 'select * from [Sheet3$]')select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=No;Database=D:\97-2003.xls', 'select * from [Sheet3$]')select * from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=No;Database=D:\2007.xlsx', 'select * from [Sheet3$]')/*F1  F2  F3  F4  F5  F6  F7  F8  F9  F10--- --- --- --- --- --- --- --- --- ---J   I   H   G   F   E   D   C   B   AC1  C2  C3  C4  C5  C6  C7  C8  C9  C10*/ -------------------------------------------------------------------------------- 如何访问隐藏的 Sheet隐藏 Sheet 的访问情况比较复杂,就不写测试过程了,归纳一下: 使用 OpenRowSet(query) 肯定可以访问。Excel 2007 任何写法都可以访问(Jet 引擎不能访问 Excel 2007)。打开的 Excel 文件任何写法都可以访问(Jet 引擎不能访问打开的 Excel 文件)。 -------------------------------------------------------------------------------- 如何访问非常规命名的 Sheet新建一个空白的 Sheet,重命名为 4 保存关闭: 使用 OpenRowSet(query) 可以正常访问。其它写法,用单引号限定名称 ['4$'] 可以访问。OpenRowSet(query) 也可以使用单引号限定访问:'select * from [''4$'']' 引出最后一个问题,访问 Excel 97-2003 空白的 Sheet,会返回一行 NULL 值,访问 Excel 2007 空白的 Sheet,返回空结果集,数据类型均解析为 nvarchar(255)。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-623162-1-1.html 上篇帖子: informix 的sql语句 下篇帖子: mybatis动态sql-13083958
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表