Наша организация хранит много важных данных в базе данных Adabas для мэйнфреймов. У нас есть ODBC-доступ к этим данным, и мы успешно запросили / обновили их из C#, используя ODBC / Natural «хранимые процедуры».
Что мы хотели бы сделать сейчас, так это запросить таблицу мэйнфрейма из хранимых процедур SQL Server 2005, записать результаты в табличную переменную, обработать ее и объединить результат с собственными данными SQL в качестве набора результатов.
Выполнение Natural proc из SQL работает нормально, когда мы просто выбираем его; однако, когда мы вставляем результат в табличную переменную, кажется, что SQL запускает распределенную транзакцию, которая, в свою очередь, наносит ущерб нашим соединениям.
Учитывая, что мы не выполняем обновления, можно ли отключить это поведение DTC-эскалации?
Есть какие-нибудь советы по правильной настройке DTC для взаимодействия с драйвером Shadow ODBC DataDirect (ранее Neon Systems)?


Я не уверен насчет DTC, но DTSX (службы интеграции) могут быть полезны для перемещения данных. Однако, если вы можете просто запросить данные, вы можете посмотреть на добавление связанного сервера для прямого доступа. Затем вы можете просто написать простой запрос для заполнения таблицы на основе выбора из таблицы связанного сервера.
Это правда. Как вы могли догадаться, процедуры Natural, которые мы хотим вызвать, выполняют поиск и вычисления, которые мы хотели бы сохранить на этом уровне, если это возможно.
Проверьте SET REMOTE_PROC_TRANSACTIONS OFF, который должен его отключить.
Или sp_serveroption, чтобы настроить связанный сервер в целом, а не на пакет.
Поскольку вы пишете на стороне MS SQL, вы запускаете транзакцию. По умолчанию он увеличивается независимо от того, нужно это или нет. Даже если переменная таблицы не участвует в транзакции.
Раньше у меня были аналогичные проблемы, когда сторона MS SQL ведет себя по-разному в зависимости от того, пишет ли MS SQL, в хранимой процедуре и других материалах. Самый надежный способ, который я нашел, - использовать динамические вызовы SQL на моем связанном сервере Sybase ...
Следующий код устанавливает «Включить продвижение распределенных транзакций» для связанных серверов:
USE [master]
GO
EXEC master.dbo.sp_serveroption @server=N'REMOTE_SERVER', @optname=N'remote proc transaction promotion', @optvalue=N'false'
GO
Это позволит вам вставить результаты вызова хранимой процедуры связанного сервера в переменную таблицы.
У меня не сработало на SQL Server 2008. (Выдал ту же ошибку «удаленный сервер не поддерживает распределенные транзакции».) Однако изменение параметра «продвижение удаленной транзакции» на странице свойств «параметры сервера» для связанного сервера сработало. .