Я пытаюсь импортировать данные из файлов Excel 2007 (.xlsx) в SQL Server 2008 с помощью команды T-SQL OpenRowset() с помощью Microsoft.ACE. OLEDB.12.0 "поставщик OLE DB, и я получаю постоянную ошибку« Не удалось найти устанавливаемый ISAM ». Все аппаратные средства - 32-разрядные.Как решить «Не удалось найти устанавливаемый ISAM». ошибка для поставщика OLE DB «Microsoft.ACE.OLEDB.12.0»
[Пересмотренный 1/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:
<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», но впоследствии не удается?)
Я пробовал это с несколькими файлами 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 соответственно), но безрезультатно.
Резюмируя:
- провайдер "Microsoft.Jet.OLEDB.4.0" работает с использованием T-SQL, но "Microsoft.ACE.OLEDB.12.0" не делает.
- «Microsoft.ACE.OLEDB.12.0» работает с использованием мастера «Импорт данных ...» (насколько я могу сказать из сохраненного файла задания SSIS).
- Настройка свойств «AllowInProcess» и «DynamicParameters» на «1» изменяет ошибку на «Unspecified error». (Это шаг вперед ?!)
Любые мысли?
ли искали вы SO для этого eeor? Есть много вопросов, которые задают вопрос, большинство ответов, похоже, вращаются вокруг добавления цитат вокруг вашего «Data Source =» ... » –
Да, я потратил несколько часов на поиск SO и в других местах и попробовал много вариантов строки подключения, включая игру с котировками, поэтому я не думаю, что это проблема. (Это включает в себя копирование строки подключения SSIS, которая работает.) –
У меня такая же проблема – Pete