SQL Server:无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象

Posted

技术标签:

【中文标题】SQL Server:无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象【英文标题】:SQL Server: Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" 【发布时间】:2013-12-13 17:33:20 【问题描述】:

我正在尝试运行以下查询:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;Database=C:\Somefile.xlsx',
'SELECT * FROM [Sheet$]')

但我收到此错误:

Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

我尝试了以下方法:

sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

还有:

USE [master]
GO


EXEC master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'AllowInProcess' , 1
GO

EXEC master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters' , 1
GO

当我转到“服务器对象”->“链接服务器”->“提供程序”时,会列出 Microsoft.ACE.OLEDB.12.0。

安装了Acess Database Engine x64,所有Office产品都是64位的,我的SQL Server也是64位的。

如果重要,所有用户都可以访问 Users 文件夹中的 Temp 文件夹。

(这些都是我在这个问题的类似答案中找到的所有建议)

编辑:使用 SQL Server 2014。

【问题讨论】:

我对这些东西不够熟悉,无法记住我脑海中出现的错误消息,所以,如果这无关紧要,对不起:是因为你运行工作簿时它是打开的吗? 工作簿未打开。 当你以系统管理员身份运行时它是否工作? 不行,还是不行。 工作表命名为“Sheet”而不是“Sheet1”是否正确? 【参考方案1】:

确保关闭 Excel 电子表格并以管理员身份运行 SSMS。

【讨论】:

这为我解决了问题 以管理员身份运行 SSMS 确实有效 - 但我觉得这不应该是必要的。是否有需要以管理员身份运行的原因?【参考方案2】:

我从this blog 找到了让它为我工作所需的两个缺失步骤。

1) 检查临时文件夹的权限

这是必需的,因为提供程序在检索数据时使用临时文件夹。根据您使用的是本地系统帐户还是网络域帐户,该文件夹可以是以下之一。

对于网络帐户,文件夹是 :\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp

对于本地系统帐户 :\Windows\ServiceProfiles\LocalService\AppData\Local\Temp

右键单击此文件夹并授予其对执行代码的帐户的读写权限。

2) 检查分配的 MemToLeave 内存区域

打开 SQL Server 配置管理器 -> 服务 -> SQLServer 服务。 右键单击并选择属性。 转到高级选项卡并附加 -g512;到启动参数属性,它将解决问题。

如果您按照this MSDN article 中的说明进行操作,您也可以在不需要AllowInProcess 的情况下使其工作。核心指令是:

为了能够执行链接服务器查询,还要在链接服务器属性上将 RPC OUT 设置为 true。

使用进程外提供程序设置链接服务器所需的权限:

在 DCOMCNFG 中验证以下设置:开始 --> 运行 --> Dcomcnfg

    组件服务 -->我的电脑 ---> 属性 验证是否在“默认属性”选项卡中设置了以下选项:

    已选中“在此计算机上启用分布式 COM”。 默认身份验证 = 连接。 默认模拟级别 = 识别或模拟。

    组件服务 --> 我的电脑 --> DCOM 配置 --> MSDAINITIALIZE

    右键单击 MSDANITIALIZE --> 属性 --> 安全 在“启动和激活权限”、“访问权限”和“配置权限”下添加 SQL Server 服务帐户(如果使用 SQL 登录连接到 SQL Server)或 windows 用户帐户。 授予这些帐户的全部权限。

    重启服务器

【讨论】:

非常感谢您的建议,特别是权限部分。这并不常见,它是一个实际的解释,而不仅仅是一个解决方案。这很有价值。【参考方案3】:

我也遇到了这个问题,按照你的步骤做了,最后我遇到了你的错误。 最后,我使用 SuperUser 帐户并使用以下脚本,问题已解决。

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=Yes;IMEX=1;Database=C:\Somefile.xlsx',
'SELECT * FROM [Sheet$]')

【讨论】:

【参考方案4】:

在我们注意到我们的服务帐户被配置为使用域帐户而不是默认服务帐户之前,我们遇到了此故障并且没有任何解决方案。另一台使用本地系统的服务器使用相同的模拟设置和执行用户运行完全相同的作业。

我们调查并确认,在安全设置 |当地政策 |用户权限分配解决了这个问题。

【讨论】:

以上是关于SQL Server:无法为链接服务器“(null)”初始化 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”的数据源对象的主要内容,如果未能解决你的问题,请参考以下文章

无法从链接的 SQL Server 查询视图

[Microsoft][ODBC SQL Server Driver][SQL Server]无法将 NULL 值插入列 'msrepl_tran_version,该列不允许

链接服务器无法开始分布式事务 - SQL Server

sql server 如何改变计算结果的值 如null改变为0

SQL Server 实现跨服务器查询的方式

命名管道提供程序无法打开与 SQL Server 1231 的连接