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

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

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。

安装数据库引擎x64,所有Office产品都是64位的,而我的SQL Server也是64位的。

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

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

编辑:使用SQL Server 2014。

确保closures了Excel电子表格并以pipe理员身份运行SSMS。

我从这个博客find了两个需要让它为我工作的缺失步骤。

1) 检查Temp文件夹的权限

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

对于networking帐户,文件夹是
:\ WINDOWS \ ServiceProfiles \networking服务\应用程序数据\本地的\ Temp

并为本地系统帐户
:\ WINDOWS \ ServiceProfiles \本地服务\应用程序数据\本地的\ Temp

右键点击这个文件夹,并给它执行代码的账户的写入权限。

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

  • 打开SQL Serverconfigurationpipe理器 – >服务 – > SQLServer服务。
  • 右键单击并select属性。
  • 转到高级选项卡并追加-g512; 启动参数属性,它会解决这个问题。

如果按照本MSDN文章中的说明,也可以在不需要AllowInProcess情况下使其工作。 核心指令是:

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

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

在DCOMCNFG中validation以下设置:开始 – >运行 – > Dcomcnfg

  1. 组件服务 – >我的电脑—>属性
    validation在“默认属性”选项卡中设置了以下选项:

    • “在这台计算机上启用分布式COM”被选中。
    • 默认身份validation=连接。
    • 默认模拟级别=识别或模拟。
  2. 组件服务 – >我的电脑 – > DCOMconfiguration – > MSDAINITIALIZE

    • 右键单击MSDAINITIALIZE – >属性 – >安全性
    • 在“启动和激活权限”,“访问权限”和“configuration权限”下添加SQL Server服务帐户(如果连接到使用SQLlogin的SQL服务器)或Windows用户帐户。
    • 给这些帐户充分的权利。
  3. 重新启动服务器

我也遇到过这个问题,并且按照你的步骤做了,最后我遇到了和你一样的错误。 最后,我使用超级用户帐户,并使用下面的脚本,问题已经解决。

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