SQL Server 2012 使用 OPENROWSET 查询 Access 2007 数据错误
Posted
技术标签:
【中文标题】SQL Server 2012 使用 OPENROWSET 查询 Access 2007 数据错误【英文标题】:SQL Server 2012 querying Access 2007 data using OPENROWSET error 【发布时间】:2014-01-28 18:00:42 【问题描述】:我想在 Management Studio 中从与我的 SQL Server 2012 实例位于同一台计算机上的 Microsoft Access 2007 数据库查询数据。我不想使用链接服务器来执行此操作,因为用户可以选择不同的 Access 数据库。我正在遵循technet 上的指示以及我读过的其他来源说使用OPENROWSET
作为做我想做的事情的正确方法,但是当我在 Management Studio 中执行此操作时......
SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'C:\Users\oliver.klosoff\Desktop\New folder\41000-13-0085 Consolidated Killers LLC.mdb';
'admin';'',tblTtlHrsFringes);
...我收到以下错误:
Msg 7302, Level 16, State 1, Line 1
Cannot create an instance of OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "(null)".
数据库没有给admin用户设置密码,admin用户有读取这个表的权限。机器上安装了Access 2007 32bit,也就是64位,还有SQL Server实例。我相信 SQL Server 可以访问数据库文件,因为当我执行此操作时得到 1:
DECLARE @out INT
EXEC master.dbo.xp_fileexist 'C:\Users\oliver.klosoff\Desktop\New folder\41000-13-0085 Consolidated Killers LLC.mdb', @out OUTPUT
SELECT @out`
有没有办法做我想要完成的事情?
【问题讨论】:
【参考方案1】:最后,在几次尝试让 SQL Server 与 Access 数据库“对话”(无论是作为 SSMS 中的“链接服务器”还是通过 T-SQL 中的OPENROWSET()
)都失败后,我发现this blog post 提供了以下三个(3) 建议。
调整 #1:OLE DB 提供程序设置
ACE(或 Jet)的 OLE DB 提供程序必须启用“动态参数”和“允许进程内”选项。在 SSMS 中,打开
服务器对象>链接服务器>提供者
分支,右键单击“Microsoft.ACE.OLEDB.12.0”(或“Microsoft.Jet.OLEDB.4.0”),选择“属性”,并确保选择了这些选项:
调整 #2:临时文件夹权限
这是困扰我的一个。
显然 SQL Server 需要在对 Access 数据库运行 OLE DB 查询时将信息写入临时文件。由于 SQL Server 作为服务运行,因此它使用运行该服务的帐户的 %TEMP% 文件夹。
如果 SQL Server 服务在内置的“网络服务”帐户下运行,则临时文件夹是
%SystemRoot%\ServiceProfiles\NetworkService\AppData\Local\Temp
如果它在内置的“本地服务”帐户下运行,那么临时文件夹是
%SystemRoot%\ServiceProfiles\LocalService\AppData\Local\Temp
我的问题是 SSMS 在 my 帐户(不是 NETWORK SERVICE)下运行,所以我只有 Temp 文件夹的读取权限
一旦我授予自己对该文件夹的修改权限
并启用 OPENROWSET 查询,如另一个问题 here 中所述,即 ...
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO
...我的查询运行良好:
调整 #3:memory_to_reserve
虽然在我的情况下不需要使用它,但上述博客也声称调整 SQL Server 服务的“-g memory_to_reserve”启动参数也可以帮助避免类似错误。为此:
启动 SQL Server 配置管理器 右键单击 SQL Server 服务(“SQL Server 服务”选项卡)并选择“属性” 在“高级”选项卡上,将-g512;
添加到“启动参数”设置中
重启 SQL Server 服务
有关“memory_to_reserve”设置的更多详细信息,请参阅 MSDN 文章 here。
【讨论】:
【参考方案2】:这应该可以工作
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO
USE [DatabaseName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SELECT * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0','Data Source="C:\Employees.accdb"')...tblEMPS;
【讨论】:
【参考方案3】:假设您已安装“Northwind”示例(并在下面提到的文件夹中),以下是否会运行?
SELECT CustomerID, CompanyName
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
'admin';'',Customers);
GO
很遗憾,自从上次重新映像后,我没有重新安装 SQL Server
【讨论】:
【参考方案4】:Microsoft.Jet.OLEDB.4.0
现在可能无法使用(2018 年)。需要将AccessDatabaseEngine_X64.exe
或AccessDatabaseEngine.exe
下载到SQL server 并安装。然后使用Microsoft.ACE.OLEDB.12.0
。
【讨论】:
以上是关于SQL Server 2012 使用 OPENROWSET 查询 Access 2007 数据错误的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2012 官方版 / SQL Server 2012下载