Невозможно создать экземпляр поставщика OLE DB Microsoft.Jet.OLEDB.4.0 для связанного сервера null
Я пытаюсь экспортировать данные из Table
в Excel
через T-SQL
. После небольшого исследования я придумал этот
INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=G:\Test.xls;',
'SELECT * FROM [Sheet1$]')
SELECT *
FROM dbo.products
Когда я выполняю вышеуказанный запрос, я получаю эту ошибку
Msg 7302, уровень 16, состояние 1, строка 7 Невозможно создать экземпляр OLE Поставщик базы данных "Microsoft.Jet.OLEDB.4.0" для связанного сервера "(null)".
Итак, перешел через интернет для решения, получил ссылку ниже
https://blogs.msdn.microsoft.com/spike/2008/07/23/ole-db-provider-microsoft-jet-oledb-4-0-for-linked-server-null-returned-message-unspecified-error/
В приведенной выше ссылке они говорили, что нам нужно быть администратором для создания папки в папке С диска TEMP
, так как OPENROWSET
создает некоторые файлы или папку внутри папки TEMP
Я делаю это на своем домашнем ПК, и я администратор. Тем не менее я получаю ту же ошибку.
SQL SERVER подробнее
Microsoft SQL Server 2016 (RC1) - 13.0.1200.242 (X64) 10 марта 2016 г. 16:49:45 Авторское право (c) Оценка корпоративной корпорации Microsoft Edition (64-разрядная версия) на Windows 10 Pro 6.3 (Build 10586:)
Любые указатели на исправление проблемы будут высоко оценены
Обновление:. Я уже настроил Ad Hoc Distributed Queries
и
Выполнено следующие запросы
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1
GO
теперь я получаю эту ошибку
Msg 7438, уровень 16, состояние 1, строка 7 32-разрядный поставщик OLE DB "Microsoft.Jet.OLEDB.4.0" не может быть загружен в процессе в 64-разрядном SQL Сервер.
Ответы
Ответ 1
Хорошо, я заставил это работать для меня, и похоже, что СО позволит мне опубликовать сегодня.
У меня есть MS Sql server 2012 и Office 2013. Это кажется очень привередливым, поэтому вам, возможно, придется адаптироваться к вашим конкретным версиям.
- Загрузите 64-разрядную версию Microsoft.ACE.OLEDB.12.0 для Windows, которую можно найти здесь: https://www.microsoft.com/en-us/download/details.aspx?id=13255.
- Установите его на свой сервер.
- Проверьте пользователя, использующего SQL Server, и убедитесь, что у него есть доступ к временному каталогу C:\Windows\ServiceProfiles\LocalService\AppData\Local\Temp, если это локальная учетная запись службы, или C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp, если это учетная запись сетевого сервиса.
- Настройте "Специальные распределенные запросы" и включите файлы
Microsoft.ACE.OLEDB
следующим образом:
Вот команды SP_CONFIGURE:
SP_CONFIGURE 'show advanced options', 1;
GO
RECONFIGURE;
SP_CONFIGURE 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParam', 1
В более новой версии SQL Server 2014 вы использовали 'DynamicParameters'
вместо 'DynamicParam'
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
Убедитесь, что вы зарегистрировали msexcl40.dll следующим образом:
regsvr32 C:\Windows\SysWOW64\msexcl40.dll
Ответ 2
Проверьте sp_configure/RECONFIGURE...
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO
Смотрите эти ссылки для получения дополнительной информации:
https://technet.microsoft.com/en-us/library/aa259616(v=sql.80).aspx
http://blog.sqlauthority.com/2010/11/03/sql-server-fix-error-ms-jet-oledb-4-0-cannot-be-used-for-distributed-queries-because-the-provider-is-used-to-run-in-apartment-mode/
Ответ 3
Работает!!! Большое спасибо.
Просто для 64-битного Win Server 2012R2. Позвольте мне поместить весь рабочий script частично повторяющийся бит сверху, который нелегко (как мне) объединить вместе:
1) Загрузите версию Microsoft.ACE.OLEDB.12.0 для Windows, 64-разрядную версию, найденную здесь: https://www.microsoft.com/en-us/download/details.aspx?id=13255
2) Создайте файл excel с соответствующими столбцами (имя и класс в этом случае).
3) Выполнить код ниже:
sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO
/* -- Not sure commented bits are necessary but I also have run them
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1
GO
-- below two lines failed with: Msg 2787, Level 16, State 1, Procedure sp_MSset_oledb_prop, Line 106 Invalid format specification: '%1!.'.
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParam', 1
-- but works all two as below:
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
-- Succeded to run after success with Excel so does not looks like necessary
*/
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0;Database=C:\testing.xlsx;',
'SELECT Name, Class FROM [Sheet1$]')
SELECT [Name],[Class] FROM Qry_2
GO
Ответ 4
Я попытался переместить Файл в D:\Drive, и это сработало. Я считал, что именно C:\Drive требует большей безопасности, и причиной является ограничение доступа.
Ответ 5
Пожалуйста, выполните следующие запросы, чтобы решить эту проблему:
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1
GO