• 解决在Sql Server查询分析器中读取Excel表出现的一些问题


    在sql2005查询分析器中读取excel时遇到的几个问题,收集了网上所有资源,最后问题终于解决了,网上很多答案都是粘贴、复制形式的,所以在实际的环境中并不能用,相信有很多朋友和我遇到过一样的错误,为了避免后人犯同样的错误,现总结分享给大家:
    环境:
          系统:      windows7,
          数据库: sqlserver2005,
          office:     office2003

    SQL读取Excel常用的方式有:
    A.通过使用 OpenRowSet 和 OpenDataSource 函数
    B.通过使用链接服务器查询 Excel

    select * from OpenRowSet
             ('Microsoft.Jet.OLEDB.4.0',
              'Excel 8.0;HDR=Yes;IMEX=1;Database=E:\bb.xls',
               [Sheet1$]
              )
    一般报错:
    消息 7399,级别 16,状态 1,第 1 行
    链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 报错。提供程序未给出有关错误的任何信息。
    消息 7303,级别 16,状态 1,第 1 行
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 的数据源对象。

    select * from OpenDataSource
             ('Microsoft.Jet.OLEDB.4.0',
              'Data Source=E:\bb.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"'
              )...[Sheet1$]  
    一般报错:
    消息 7399,级别 16,状态 1,第 1 行
    链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 报错。提供程序未给出有关错误的任何信息。
    消息 7303,级别 16,状态 1,第 1 行
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 的数据源对象。

    SELECT * FROM OpenDataSource(
                                  'Microsoft.Jet.OLEDB.4.0',
                                  'Data Source=E:\bb.xls;User ID=Admin;Password=;Extended properties=Excel 5.0'
                                )...[Sheet1$]
    一般报错:
    消息 7308,级别 16,状态 1,第 1 行
    因为 OLE DB 访问接口 'Microsoft.Jet.OLEDB.4.0' 配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询。

    declare @rc int
    declare @server nvarchar(128)
    declare @srvproduct nvarchar(128)
    declare @provider nvarchar(128)
    declare @datasrc nvarchar(4000)
    declare @location nvarchar(4000)
    declare @provstr nvarchar(4000)
    declare @catalog nvarchar(128)

    set @server = 'exceltosql'
    set @srvproduct = 'excel'
    set @provider = 'microsoft.jet.oledb.4.0'
    set @datasrc = 'e:\bb.xls'
    set @provstr = 'excel 8.0'
    exec @rc = [master].[dbo].[sp_addlinkedserver] @server, @srvproduct, @provider,
    @datasrc, @location, @provstr, @catalog

    查询:
    select * from exceltosql...sheet1$

    报错:
    链接服务器"exceltosql"的 OLE DB 访问接口 "microsoft.jet.oledb.4.0" 返回了消息 "无法启动应用程序。工作组信息文件丢失,或是已被其它用户以独占方式打开。"。
    消息 7399,级别 16,状态 1,第 1 行
    链接服务器 "exceltosql" 的 OLE DB 访问接口 "microsoft.jet.oledb.4.0" 报错。身份验证失败。
    消息 7303,级别 16,状态 1,第 1 行
    无法初始化链接服务器 "exceltosql" 的 OLE DB 访问接口 "microsoft.jet.oledb.4.0" 的数据源对象。

    下面总结解决方式:
    1、在SQL Server 外围应用配置器中启用 OpenRowSet 和 OpenDataSource函数
    2、执行以上sql语句的数据库必须是本地数据库,如果为远程的数据库就会报上面的错误
    3、链接字符串 Extended Properties属性的内容要以分号间隔并用双引号括起来,sheet1$ 在括号外

    4、注意office的版本4.0是office2003,12.0是office2007的版本,看看是否装了驱动。

    5、最为关键的是要看sql server 版本号,是32位的还是64位的。x64位的sql server很多的office的驱动是不支持的。

    所以如果搞不成的话,不妨放到32位的sqlserver ,会有不少的收获

    原博客地址:http://wep2008.blogbus.com/logs/35390970.html

    64位下OPENROWSET运行出现错误

    在SSMS中执行:SELECT CustomerID, CompanyName
       FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
          'D:\nwind.mdb';
          'admin';'',Customers)

    消息7308,级别16,状态1,第1 行
    因为OLE DB 访问接口'Microsoft.Jet.OLEDB.4.0' 配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询。
      我的环境SQL Server 2008(64位)+windows2008r2(64位)

    解决办法:

    http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/58c4c61e-fa86-4809-bf7d-21bacb055d3e/

    下载最新的驱动

    原因是:在64SQL Engine中已经不提供jet.oledb.4.0的驱动了
    解决方法:下载一个ACE.Oledb.12.0 for X64位的驱动,并把连接字符串Microsoft.jet.Oledb.4.0 更改为 Microsoft.ACE.OLEDB.12.0

  • 相关阅读:
    websocket在线测试工具
    短信线上发送错误,线下成功
    nginx添加stream模块1.20
    sort 的使用
    实验、进程的同步与互斥——生产者消费者
    实验、可变分区存储管理系统模拟 —— 最先适应分配算法
    test
    c++的大数阶乘算法
    C#解析JSON字符串总结
    C++ 查看单个类对象模型利用Vs开发者命令提示工具
  • 原文地址:https://www.cnblogs.com/rodney/p/2620981.html
Copyright © 2020-2023  润新知