SELECT *
FROM OpenDataSource( '.4.0',
'Data Source="e:\";User ID=Admin;Password=Extended properties=Excel 5.0')...[sheet1$]
消息 7399,级别 16,状态 1,第 1 行
链接服务器 “(null)” 的 OLE DB 访问接口 “.4.0” 报错。身份验证失败。
消息 7303,级别 16,状态 1,第 1 行
无法初始化链接服务器 “(null)” 的 OLE DB 访问接口 “.4.0” 的数据源对象。
在sql2005查询分析器中读取excel时遇到的几个问题,收集了网上所有资源,最后问题终于解决了,网上很多答案都是粘贴、复制形式的,所以在实际的环境中并不能用,相信有很多朋友和我遇到过一样的错误,为了避免后人犯同样的错误,现总结分享给大家:
环境:
系统: windows7,
数据库: sqlserver2005,
office: office2003
SQL读取Excel常用的方式有:
A.通过使用 OpenRowSet 和 OpenDataSource 函数
B.通过使用链接服务器查询 Excel
select * from OpenRowSet
('.4.0',
'Excel 8.0;HDR=Yes;IMEX=1;Database=E:\',
[Sheet1$]
)
一般报错:
消息 7399,级别 16,状态 1,第 1 行
链接服务器 “(null)” 的 OLE DB 访问接口 “.4.0” 报错。提供程序未给出有关错误的任何信息。
消息 7303,级别 16,状态 1,第 1 行
无法初始化链接服务器 “(null)” 的 OLE DB 访问接口 “.4.0” 的数据源对象。
select * from OpenDataSource
('.4.0',
'Data Source=E:\;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"'
)...[Sheet1$]
一般报错:
消息 7399,级别 16,状态 1,第 1 行
链接服务器 “(null)” 的 OLE DB 访问接口 “.4.0” 报错。提供程序未给出有关错误的任何信息。
消息 7303,级别 16,状态 1,第 1 行
无法初始化链接服务器 “(null)” 的 OLE DB 访问接口 “.4.0” 的数据源对象。
SELECT * FROM OpenDataSource(
'.4.0',
'Data Source=E:\;User ID=Admin;Password=;Extended properties=Excel 5.0'
)...[Sheet1$]
一般报错:
消息 7308,级别 16,状态 1,第 1 行
因为 OLE DB 访问接口 ‘.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 = '.4.0'
set @datasrc = 'e:\'
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 访问接口 “.4.0” 返回了消息 “无法启动应用程序。工作组信息文件丢失,或是已被其它用户以独占方式打开。”。
消息 7399,级别 16,状态 1,第 1 行
链接服务器 “exceltosql” 的 OLE DB 访问接口 “.4.0” 报错。身份验证失败。
消息 7303,级别 16,状态 1,第 1 行
无法初始化链接服务器 “exceltosql” 的 OLE DB 访问接口 “.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 ,会有不少的收获
原博客地址:/logs/
64位下OPENROWSET运行出现错误
在SSMS中执行:
SELECT CustomerID, CompanyName
FROM OPENROWSET('.4.0',
'D:\';
'admin';'',Customers)
消息7308,级别16,状态1,第1 行
因为OLE DB 访问接口’.4.0’ 配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询。
我的环境SQL Server 2008(64位)+windows2008r2(64位)
解决办法:
/Forums/en/vbgeneral/thread/58c4c61e-fa86-4809-bf7d-21bacb055d3e/
下载最新的驱动
原因是:在64SQL Engine中已经不提供.4.0的驱动了
解决方法:下载一个.12.0 for X64位的驱动,并把连接字符串.4.0 更改为 .12.0