SQL Server 2012使用OPENROWSET错误查询Access 2007数据

时间:2014-01-28 18:00:42

标签: sql-server ms-access sql-server-2012 ms-access-2007

我想从位于与我的SQL Server 2012实例相同的计算机上的Microsoft Access 2007数据库中查询Management Studio中的数据。我不想使用链接服务器来执行此操作,因为用户可以选择不同的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`

有没有办法做我想要完成的事情?

4 个答案:

答案 0 :(得分:1)

最后,在几次尝试使用SQL Server"与#34; Access数据库 - 作为"链接服务器"在SSMS中或通过T-SQL中的OPENROWSET() - 我发现this blog post提供了以下三(3)条建议。

调整#1:OLE DB提供程序设置

ACE(或Jet)的OLE DB提供程序必须具有"动态参数"和"允许inprocess"选项已启用。在SSMS中,打开

服务器对象>链接服务器>提供商

分支,右键单击" Microsoft.ACE.OLEDB.12.0" (或" Microsoft.Jet.OLEDB.4.0"),选择"属性",并确保选择这些选项:

ProviderOptions.png

调整#2:临时文件夹权限

这是困扰我的那个。

显然,SQL Server需要在对Access数据库运行OLE DB查询时将信息写入临时文件。由于SQL Server作为服务运行,因此它使用运行服务的帐户的%TEMP%文件夹。

如果SQL Server服务在内置的"网络服务"帐户然后临时文件夹是

%SystemRoot%\ ServiceProfiles \ NetworkService \ AppData \ Local \ Temp

如果它是在内置的"本地服务"帐户然后临时文件夹是

%SystemRoot%\ ServiceProfiles \ LocalService \ AppData \ Local \ Temp

我的问题是SSMS在我的帐户下运行(不是网络服务)所以我只对Temp文件夹有读取权限

OldPermissions.png

我授予自己对该文件夹的修改权限

NewPermissions.png

并启用了另一个问题here中记录的OPENROWSET查询,即......

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO

...我的查询工作正常:

MyQuery.png

调整#3:memory_to_reserve

虽然我不需要在我的情况下使用它,但前面提到的博客也声称要调整" -g memory_to_reserve" SQL Server服务的启动参数也可以帮助避免类似的错误。要做到这一点:

  • 启动SQL Server配置管理器
  • 右键单击SQL Server服务(" SQL Server服务"选项卡),然后选择"属性"
  • on" Advanced"选项卡,将-g512;添加到"启动参数"设置
  • 重新启动SQL Server服务

有关" memory_to_reserve"的详细信息;设置请参阅MSDN文章here

答案 1 :(得分:1)

这应该有效

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;

答案 2 :(得分:0)

假设您安装了“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

答案 3 :(得分:0)

Microsoft.Jet.OLEDB.4.0现在可能无效(2018年)。需要将AccessDatabaseEngine_X64.exeAccessDatabaseEngine.exe下载到SQL服务器并安装它。然后使用Microsoft.ACE.OLEDB.12.0