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
组件服务 – >我的电脑—>属性
validation在“默认属性”选项卡中设置了以下选项:
- “在这台计算机上启用分布式COM”被选中。
- 默认身份validation=连接。
- 默认模拟级别=识别或模拟。
组件服务 – >我的电脑 – > DCOMconfiguration – > MSDAINITIALIZE
- 右键单击MSDAINITIALIZE – >属性 – >安全性
- 在“启动和激活权限”,“访问权限”和“configuration权限”下添加SQL Server服务帐户(如果连接到使用SQLlogin的SQL服务器)或Windows用户帐户。
- 给这些帐户充分的权利。
重新启动服务器
我也遇到过这个问题,并且按照你的步骤做了,最后我遇到了和你一样的错误。 最后,我使用超级用户帐户,并使用下面的脚本,问题已经解决。
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=C:\Somefile.xlsx', 'SELECT * FROM [Sheet$]')
- 将定义的范围应用于WorksheetFunction时types不匹配
- 从Excel文件中parsingstring以翻译Android应用程序
- 如何避免OLEDB将“。”s转换为列名中的“#”?
- 如何在Excel中将一个单元格的更改添加到另一个单元格,而不使用VBA?
- Apache POI的C#端口会破坏.xlsx中的embedded式OLE对象
- 对于每个循环和多个范围
- Excel VBA – Userform vlookuperror handling
- SQL ServerdynamicSQL“报价地狱”与OPENDATASOURCE
- 使用VBA将文件夹导入Excel(FileDialogFolderPicker)