【发布时间】:2012-02-06 13:14:56
【问题描述】:
我正在尝试使用带有“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 位的。
我还尝试重新安装 Office 2007 和 Office 2010 版本的 AccessDatabaseEngine.exe(分别为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”会将错误更改为“未指定错误”。 (这是向前迈出的一步吗?!)
有什么想法吗?
【问题讨论】:
-
你搜索过这个eeor吗?有很多问题问它,大多数答案似乎都围绕在您的
Data Source=' ... '周围添加引号 -
是的,我花了几个小时搜索 SO 和其他地方,并尝试了连接字符串的许多变体,包括使用引号,所以我认为这不是问题。 (这包括复制正在工作的 SSIS 连接字符串。)
-
我设法解决类似问题的唯一方法是使用 MDW 文件。见here
-
有趣!感谢您的评论...希望对其他人有用。我没有机会重新测试我采取了不同的方法,该项目现在已经过时了。
标签: tsql excel-2007 oledb openrowset isam