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

时间:2013-12-13 17:33:20

标签: sql-server excel openrowset

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

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

当我转到'服务器对象'时 - > '链接服务器' - > 'Providers',Microsoft.ACE.OLEDB.12.0已列出。

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

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

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

编辑:使用SQL Server 2014。

4 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:4)

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

  

1)检查Temp文件夹的权限

     

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

     

对于网络帐户,文件夹为
  :\ Windows \ ServiceProfiles \网络服务\应用程序数据\本地\温度

     

对于本地系统帐户而言   :\ Windows \ ServiceProfiles \本地服务\应用程序数据\本地\温度

     

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

     

2)检查分配的MemToLeave存储区

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

如果您按照this MSDN article中的说明操作,也可以在不需要AllowInProcess的情况下使其正常运行。核心指示是:<​​/ p>

  

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

     

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

     

验证DCOMCNFG中的以下设置:开始 - &gt;运行 - &gt; DCOMCNFG

     
      
  1. 组件服务 - &gt;我的电脑---&gt;属性
      确认在“默认属性”选项卡中设置了以下选项:

         
        
    • '在此计算机上启用分布式COM'已选中。
    •   
    • 默认验证=连接。
    •   
    • 默认模拟级别=识别或模拟。
    •   
  2.   
  3. 组件服务 - &gt;我的电脑 - &gt; DCOM配置 - &gt; MSDAINITIALIZE

         
        
    • 右键单击MSDAINITIALIZE - &gt;属性 - &gt;安全性
    •   
    • 在“启动和激活权限”,“访问权限”和“配置权限”下添加SQL Server服务帐户(如果使用SQL登录连接到SQL服务器)或Windows用户帐户。
    •   
    • 授予这些帐户完全的权利。
    •   
  4.   
  5. 重启服务器

  6.   

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我们遇到了此失败,并且没有解决任何问题,直到我们注意到我们的服务帐户被配置为使用域帐户,而不是默认服务帐户。使用本地系统的另一台服务器以相同的模拟设置运行完全相同的作业并执行用户。

我们进行了调查并确认,在“安全设置” |“安全性”下的“本地安全策略”中为SQL Agent服务帐户添加了 Act作为操作系统的一部分权限。当地政策|用户权限分配解决了该问题。