Проблема:

При выполнении запроса из связанного сервера через openrowset:

select *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=C:\temp\Таблица соответ.xlsx', [Лист1$])

останавливается служба сервера и в панели результата запроса выходит сообщение об ошибке:

Сообщение 109, уровень 20, состояние 0, строка 0
Ошибка на транспортном уровне при получении результатов с сервера. (provider: Shared Memory Provider, error: 0 — Канал был закрыт.)

На сервере установлен MSSQL 2012 SP4.

Решение:

Чтобы сервер не крашился нужно установить хотфикс:

Статья: https://support.microsoft.com/en-us/help/2859413/sql-server-service-crashes-when-you-run-a-linked-server-query-on-a-win

Прямая ссылка на хотфикс: https://support.microsoft.com/ru-ru/hotfix/kbhotfix?kbnum=2859413&kbln=en-US

 

После этого запрос стал выдавать следующую ошибку:

Не удалось получить требуемый интерфейс («IID_IDBCreateCommand») от поставщика OLE DB «Microsoft.ACE.OLEDB.12.0» для связанного сервера

 

Данную проблему удалось решить следующим образом:

В свойствах провайдера нужно включит галочку: Allow inprocess (Допускать в ходе процесса)

Далее ПУСК — выполнить: Dcomcnfg

Службы компонентов — Мой компьютер — Настройка DCOM — MSDAINITIALIZE, щелкаем правой кнопкой, переходим на вкладку безопасность и во всех трёх группах переводим пульку на «Настроить», в каждой группе щелкаем кнопку «Изменить» и если у вас служба сервера стартует под учетной записью MSSQLSERVER, добавляем в каждой группе полные права для этой учетной записи. После этого запрос стал выполняться правильно.


  1. Egor:

    Хах, для 19 SQL-сервера такая-же ошибка возникает, но хот-фикс уже не доступен. Весело прям.