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.exeAccessDatabaseEngine.exe 下载到SQL server 并安装。然后使用Microsoft.ACE.OLEDB.12.0

【讨论】:

以上是关于SQL Server 2012 使用 OPENROWSET 查询 Access 2007 数据错误的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2012 r2怎么设置新用户

sql server2012密钥 用哪个

sql server 2012 一直卡在这

SQL Server 2012 官方版 / SQL Server 2012下载

ms sql2012 能否安装在win2008 server

使用 PHP 在运行 Windows Server 2012 的物理服务器上连接到 SQL Server 2012