Подтвердить что ты не робот

Невозможно создать экземпляр поставщика 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 Сервер.

4b9b3361

Ответ 1

Хорошо, я заставил это работать для меня, и похоже, что СО позволит мне опубликовать сегодня.

У меня есть MS Sql server 2012 и Office 2013. Это кажется очень привередливым, поэтому вам, возможно, придется адаптироваться к вашим конкретным версиям.

  1. Загрузите 64-разрядную версию Microsoft.ACE.OLEDB.12.0 для Windows, которую можно найти здесь: https://www.microsoft.com/en-us/download/details.aspx?id=13255.
  2. Установите его на свой сервер.
  3. Проверьте пользователя, использующего SQL Server, и убедитесь, что у него есть доступ к временному каталогу C:\Windows\ServiceProfiles\LocalService\AppData\Local\Temp, если это локальная учетная запись службы, или C:\Windows\ServiceProfiles\NetworkService\AppData\Local\Temp, если это учетная запись сетевого сервиса.
  4. Настройте "Специальные распределенные запросы" и включите файлы 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