Я пытаюсь импортировать данные из файлов Excel 2007 (.xlsx) в SQL Server 2008 с помощью команды T-SQL OpenRowset () с поставщиком OLE DB «Microsoft.ACE.OLEDB.12.0», и я получаю постоянную ошибку «Не удалось найти устанавливаемый ISAM». Все оборудование 32-разрядное.
[Отредактировано 01.10.12, чтобы попытаться более четко сфокусировать внимание на аномалиях]
Следующий оператор 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$]'
)
Однако, когда я пробую файл * .xls с поставщиком Microsoft.ACE.OLEDB.12.0, который должен быть обратно совместим с форматом * .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:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\work\TestData.xlsx;Extended Properties="Excel 12.0 XML;HDR=YES";
Я также выполнил соответствующую конфигурацию 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», но впоследствии не работает?)
Я пробовал это с несколькими файлами Excel на двух разных машинах / ОС (Windows Server 2003, Windows XP SP3). Обе машины 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 соответственно), но безрезультатно.
Подводя итог:
Есть мысли?