我正在尝试使用带有“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$]'
)
如果我将 Excel 文件保存为“Excel 97-2003”格式 (.xls) 并使用较旧的 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$]'
)
但是,当我尝试使用 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$]'
)
此外,有趣的是,当我使用 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>
我还完成了相关的 SQL Server 配置以允许 OPENROWSET 分布式查询:
sp_configure 'show advanced options', 1
reconfigure
GO
sp_configure 'Ad Hoc Distributed Queries', 1
reconfigure
GO
如果我还设置了以下 *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
...然后错误更改为“未指定的错误”:
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)".
但是,我不确定这是上游还是下游错误。(现在是否找到“可安装的 ISAM”但随后失败?)
我已经在两台不同的机器/操作系统(Windows Server 2003、Windows XP SP3)上尝试了多个 Excel 文件。两台机器都是 32 位的。
我还尝试重新安装 AccessDatabaseEngine.exe 的 Office 2007 和 Office 2010 版本(http://www.microsoft.com/download/en/details.aspx?id=23734和http://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”会将错误更改为“未指定错误”。(这是向前迈出的一步吗?!)
有什么想法吗?