Вызов процедуры T- SQL с использованием OPENROWSET - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть два запроса.

Этот первый запрос создает файл .csv в папке C:\... без ошибок:

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=C:\Temp\TEMP_SQL_FOLDER\T-SQL to csv\;HDR=YES;FMT=Delimited','SELECT * FROM [test3.csv]') 
    SELECT Id, PatientNumber, Title_Id, FirstName, LastName, Gender_Id 
    FROM PPM2..Activity_Patient ap

Этот второй запрос должен выполнять то же самое, за исключением того, что оператор SELECT заменяется вызовом процедуры:

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=C:\Temp\TEMP_SQL_FOLDER\T-SQL to csv\;HDR=YES;FMT=Delimited','SELECT * FROM [test3.csv]') 
    EXEC dbo.PPMLoad_MediRecOSRServices @FinancialYear='2020'

Второй оператор не работает и выдает эту ошибку:

Msg 7390, уровень 16 Состояние 2, строка 10
Запрошенная операция не может быть выполнена, поскольку поставщик OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "(null)" не поддерживает требуемый интерфейс транзакции.

У меня включены необходимые настройки:

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

Второй запрос просто не запускается. Я не использую никаких связанных серверов. Это просто простой экспорт на локальный C: диск.

Есть идеи?

1 Ответ

0 голосов
/ 27 февраля 2020

В сообщении об ошибке указано, что SQL Сервер пытается запустить распределенную транзакцию, которая не поддерживается драйвером доступа.

Вы можете попытаться разрешить нетрансакционные обновления для драйвера:

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'NonTransactedUpdates', 1

Я нашел это в ответе на dba.stackexchange , который также повторяет следующее предупреждение из документации драйвера ACE, о котором вам, вероятно, следует остерегаться в этой ситуации:

Распространяемый Access Database Engine 2016 не предназначен:. , , Используется системной службой или программой на стороне сервера, где код будет запускаться под системной учетной записью, или будет одновременно работать с несколькими удостоверениями пользователя, или с высокой степенью повторяемости и ожидает поведения без сохранения состояния. Примеры могут включать в себя программу, запускаемую из планировщика задач, когда пользователь не вошел в систему, или программу, вызываемую из серверного веб-приложения, такого как ASP. NET, или распределенный компонент, работающий под службами COM +.

...