Не удается создать экземпляр поставщика OLE DB Microsoft.Jet.OLEDB.4.0 для нулевого связанного сервера

Я пытаюсь экспортировать данные из 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 

Когда я выполняю вышеуказанный запрос, я получаю эту ошибку

Сообщение 7302, уровень 16, состояние 1, строка 7 Не удается создать экземпляр поставщика OLE DB «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/

В приведенной выше ссылке они говорили, что нам нужно быть администратором, чтобы создать папку на диске C в папке TEMP, поскольку OPENROWSET создает некоторые файлы или папку внутри папки TEMP

Я делаю это на своем домашнем ПК и являюсь администратором. Все еще получаю ту же ошибку.

Сведения о SQL SERVER

Microsoft SQL Server 2016 (RC1) — 13.0.1200.242 (X64) 10 марта 2016 г. 16:49:45 Авторское право (c) Microsoft Corporation Enterprise Evaluation Edition (64-разрядная версия) в Windows 10 Pro 6.3 (сборка 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 

теперь я получаю эту ошибку

Сообщение 7438, уровень 16, состояние 1, строка 7. 32-разрядный поставщик OLE DB «Microsoft.Jet.OLEDB.4.0» не может быть загружен в процессе на 64-разрядном SQL Server.


person Pரதீப்    schedule 02.05.2016    source источник
comment
Эта ссылка SO может вам помочь. - stackoverflow.com/questions/12090555/   -  person Krishnraj Rana    schedule 02.05.2016
comment
Еще я заметил, что в вашем операторе вставки вместо SELECT * FROM dbo.products должно быть - INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=G:\Test.xls;', 'SELECT * FROM [Sheet1$]')   -  person Krishnraj Rana    schedule 02.05.2016
comment
@KrishnrajRana - без разницы, все равно получаю ту же ошибку :(   -  person Pரதீப்    schedule 02.05.2016
comment
Может быть, 64/32-битная проблема между процессом SQL и драйвером OLEDB?   -  person Simon Mourier    schedule 09.05.2016
comment
И SQL Server, и MS Office (или только драйверы OLEDB) должны быть 64-битной версии. Подробнее здесь dba. stackexchange.com/questions/60094/   -  person gofr1    schedule 09.05.2016
comment
Я делаю это на своем домашнем ПК и являюсь администратором. - ваша служба SQL Server работает под учетной записью администратора?   -  person Alex    schedule 10.05.2016
comment
@Alex - Как проверить, работает ли служба SQL Server под учетной записью администратора? В настоящее время я использую логин Windows для входа в SQL Server.   -  person Pரதீப்    schedule 10.05.2016
comment
@Prdp - Пуск -> Все программы -> Microsoft SQL Server xxxx -> Диспетчер конфигурации SQL Server xxxx ИЛИ откройте Диспетчер управления службами (Инструменты администрирования -> Службы). Найдите SQL Server в списке, затем щелкните правой кнопкой мыши и выберите свойства, затем вкладку «Войти». Проверьте учетную запись, под которой он запущен. Там же можно изменить учетную запись.   -  person Alex    schedule 10.05.2016
comment
Можете ли вы установить драйверы ACE вместо драйверов Jet и использовать OPENROWSET('Microsoft.ACE.OLEDB.12.0',   -  person sqlab    schedule 10.05.2016
comment
Включите параметры Microsoft.Jet.OLEDB вместо их отключения. Я думаю, это может решить вашу проблему   -  person quest4truth    schedule 11.05.2016
comment
SO по какой-то причине не хочет позволять мне отправлять ответы сегодня, а просто изменяет ваши 0 на 1. Я получаю информацию с этого веб-сайта: sqlsrv4living.blogspot.com/2013_12_01_archive.html   -  person quest4truth    schedule 11.05.2016
comment
@ user3481891 - Я чувствую себя таким глупым. После перехода на 1 я получаю это The 32-bit OLE DB provider "Microsoft.Jet.OLEDB.4.0" cannot be loaded in-process on a 64-bit SQL Server.   -  person Pரதீப்    schedule 12.05.2016
comment
@user3481891 user3481891 - Как говорили другие, это проблема с 32-битной и 64-битной версиями.   -  person Pரதீப்    schedule 12.05.2016
comment
Да, я тоже это понял, но причина исходного сообщения об ошибке в том, что свойства oledb были отключены. Как видно из длинного разговора здесь, это не тривиальная или хорошо задокументированная проблема.   -  person quest4truth    schedule 12.05.2016


Ответы (4)


У меня есть сервер MS Sql 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. Настройте «Ad Hoc Distributed Queries» и включите файлы 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
person quest4truth    schedule 12.05.2016
comment
Прости. Остальное постараюсь написать в комментарии. Я думаю, что я был защищен от публикации слишком длинной строки. - person quest4truth; 13.05.2016
comment
Вот команды 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 - person quest4truth; 13.05.2016
comment
Убедитесь, что вы зарегистрировали msexcl40.dll следующим образом: regsvr32 C:\Windows\SysWOW64\msexcl40.dll - person quest4truth; 13.05.2016
comment
Основная идея состоит в том, чтобы затем создать связанный сервер и убедиться, что ваш формат Excel соответствует вашему запросу. SO просто не позволяет мне ввести правильный синтаксис. попробую на другом компе - person quest4truth; 13.05.2016
comment
Хорошо, вот остальное. На другом компьютере, так что, надеюсь, это будет иметь значение. Добавьте связанный сервер следующим образом: EXEC master.dbo.sp_addlinkedserver @server=N'anyservername', @srvproduct=N'Excel', @provider=N'Microsoft.ACE.OLEDB.12.0', @datasrc=N'C:\Path\to\your\excel\file.xlsx', @provstr=N'Excel 12.0, HDR=YES' - person quest4truth; 14.05.2016
comment
Теперь любой из этих запросов работает: Выберите запрос: SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Test/x;sx'JDR=YES;IMEX=1', SELECT * FROM [Sheet1$]') Вставьте запрос: INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\Test/x;sx'JDR=YES;IMEX=1', SELECT * FROM [Sheet1$]') SELECT * FROM YourTable - person quest4truth; 14.05.2016
comment
В SQL Server 2014 мне пришлось «EXEC sp_configure» и использовать «DynamicParameters» вместо «DynamicParam». - person mrówa; 14.03.2017
comment
если файл находится на общем ресурсе unc, обязательно настройте spn и установите разрешения для временной папки — см. stackoverflow.com/ а/57095126/4049371 - person Benjamin Freitag; 18.07.2019

Проверьте 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-поскольку-поставщик-используется-для-запуска-в-квартирном-режиме/

person JimR    schedule 10.05.2016

Работает !!! Большое спасибо. Только для 64-битного сервера Win 2012R2. Приведу весь рабочий скрипт, частично повторяющий биты сверху, которые непросто (как по мне) совместить вместе:

  1. Загрузите 64-разрядную версию Microsoft.ACE.OLEDB.12.0 для Windows, которую можно найти здесь: 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 

-- Until SQL Server 2012

EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1   
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1

-- SQL Server 2014 or later

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1


-- Now you can export to Excel
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

-- Or import from Excel
select * from OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
'Excel 8.0;Database=c:\targetWorkbook.xls;', 
'SELECT * FROM [targetSheet$]') 
person FerroPont    schedule 17.07.2017

Пожалуйста, выполните следующие запросы, чтобы решить эту проблему:

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 
person shrikrishna das    schedule 14.08.2017