如何解决"无法找到可安装的ISAM".OLE DB提供程序"Microsoft.ACE.OLEDB.12.0"的错误

Mar*_*ATS 18 t-sql oledb excel-2007 isam openrowset

我正在尝试使用带有"Microsoft.ACE.OLEDB.12.0"OLE DB提供程序的T-SQL OpenRowset()命令将Excel 2007(.xlsx)文件中的数据导入SQL Server 2008,并且我得到一个持久的"找不到可安装的ISAM"错误.所有硬件都是32位.

[修订于2012年1月10日,试图更加集中于异常]

以下T-SQL语句产生错误:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES"',
    'SELECT * FROM [Sheet1$]'
)
Run Code Online (Sandbox Code Playgroud)

如果我以"Excel 97-2003"格式(.xls)保存Excel文件并使用较旧的Microsoft.Jet.OLEDB.4.0提供程序导入数据,它可以正常工作.这让我觉得这不是安全或其他环境问题.

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
    'Excel 8.0;Database=C:\work\TestData.xls;HDR=YES', 
    'SELECT * FROM [Sheet1$]'
)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用Microsoft.ACE.OLEDB.12.0提供程序的*.xls文件时,它应该向后兼容*.xls格式,它再次失败并出现相同的错误:

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Data Source=C:\work\TestData.xls;Extended Properties="Excel 8.0;HDR=YES";', 
    'SELECT * FROM [Sheet1$]'
)
Run Code Online (Sandbox Code Playgroud)

另外,有趣的是,当我使用SSMS"导入数据..."向导时,它工作正常.我将导入数据向导输出保存为SSIS包,并查看SSIS文件以试图弄清楚它是如何工作的,并且它已成功使用Microsoft.ACE.OLEDB.12.0提供程序.这是SSIS包中的连接字符串:

<DTS:Property DTS:Name="ConnectionString">
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES";
</DTS:Property>
Run Code Online (Sandbox Code Playgroud)

我还完成了相关的SQL Server配置以允许OPENROWSET分布式查询:

sp_configure 'show advanced options', 1
reconfigure
GO
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure
GO
Run Code Online (Sandbox Code Playgroud)

如果我还设置了以下*sp_MSset_oledb_prop*值(我在某个帖子中找到)...

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 
Run Code Online (Sandbox Code Playgroud)

...然后错误更改为"未指定的错误":

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这是上游还是下游错误.(它现在找到"可安装的ISAM"但随后失败了吗?)

我在两台不同的机器/操作系统(Windows Server 2003,Windows XP SP3)上尝试了多个Excel文件.两台机器都是32位的.

我还尝试重新安装Office 2007和Office 2010版本的AccessDatabaseEngine.exe(http://www.microsoft.com/download/en/details.aspx?id=23734http://www.microsoft .com/download/en/details.aspx?id = 13255,分别),无济于事.

总结一下:

  • "Microsoft.Jet.OLEDB.4.0"提供程序使用T-SQL,但"Microsoft.ACE.OLEDB.12.0"不使用.
  • "Microsoft.ACE.OLEDB.12.0"使用"导入数据..."向导(据我所知,从保存的SSIS作业文件中).
  • 将"AllowInProcess"和"DynamicParameters"属性设置为"1"会将错误更改为"未指定的错误".(这是向前迈出的一步吗?!)

有什么想法吗?

小智 -1

我认为答案隐藏在您发布的 SSIS 包信息中。新的文件格式 xlsx 以 XML 格式而不是旧格式存储数据。再看一下。它显示...扩展属性=“Excel 12.0 XML;HDR=YES”

不要错过标准内容之后的 XML。(就其价值而言,我还了解到您需要“Excel 12.0 Macro”才能连接 xslm 文件。)

试一试。很奇怪,但希望它能起作用。

  • 上面的第一个代码片段包括您建议的“扩展属性 =”Excel 12.0 XML;HDR=YES”,但仍然不起作用。 (2认同)