Try catch и linked server - не могу поймать ошибку

Любитель Try Catch
Дата: 19.02.2010 16:06:39
Добрый день, всех с наступающим.
Есть примерно такой код :
+

while exists (select * from table0)
begin
	begin try
		exec dbo.proc
	end try
	begin catch
		print error_message()
	end catch
end
-----------------------------------
procedure proc
@Error_Message output
declare @sql varchar(max)

set xact_abort on

set @_sql ='update T1 from ['+SRVR+'].['+DB+'].['+SCHM+'].Table1 set F1 = 5'
begin transaction
begin try
 exec(@_sql);
 commit transaction;
 set @Error_Message = '';
end try
begin catch
 set @Error_Message = error_message();
 rollback transaction;
end catch

При выполнении строки update на удаленном сервере в триггере на таблицу Table1 вызывается Raiserror + rollback.
При выполнении в студии скрипта с циклом получаю примерно такую ошибку
Msg 1206, Level 18, State 118, Procedure Table1_Upd, Line 158
The Microsoft Distributed Transaction Coordinator (MS DTC) has cancelled the distributed transaction.
и выполнение цикла обрывается.

А очень хочется перехватить возникшее исключение и обработать.
Уважаемые коллеги, плиз хелп


Сервера такие :
локальный
Microsoft SQL Server 2005 - 9.00.4266.00 (X64) Oct 7 2009 17:38:17 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)

удалённый
Microsoft SQL Server 2005 - 9.00.4230.00 (Intel X86) Jul 30 2009 13:45:19 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
Любитель Try Catch
Дата: 19.02.2010 16:10:59
Любитель Try Catch,
Частично сам и отвечу :
technet
msdn
Вызов оператора RAISERROR с уровнем серьезности ошибки менее 20 из удаленной хранимой процедуры вызывает ошибку аварийного завершения инструкции на удаленном сервере. Конструкция TRY…CATCH на локальном сервере обрабатывает только ошибки аварийного завершения удаленного пакета. Если удаленная хранимая процедура вызывает оператор RAISERROR с уровнем серьезности менее 20 и эта удаленная хранимая процедура находится в области блока TRY на локальном сервере, то RAISERROR не передает управление блоку CATCH конструкции TRY…CATCH. Однако оператор RAISERROR с уровнем серьезности ошибки 20 или более на удаленном сервере разрывает соединение, и выполнение на локальном сервере передается блоку CATCH

Пока на ум приходит выполнять не через exec. а через sp_executesql с вложенным try catch или что-то подобное. Нет ли у кого подобного опыта?
Любитель Try Catch
Дата: 19.02.2010 17:27:15
Мда.
Уже и сели и встали и в бубен постучали.
Пробовал без try catch, обрабатывая @@error на каждом шаге.
Впечатление такое, что никаких обработок ошибок нет вообще, а MS DTC обнаруживает ошибку и просто рвет коннект между серверами. И никак перехватывать этот обрыв не получается.

Может в настройках MS DTC есть какая галка чудесная?
Bukva_ed
Дата: 24.08.2020 11:52:37
Сейчас решаю проблему логивания событий...
нашел такую статью...
возможно кому то будет полезна

https://www.sql.ru/articles/mssql/2005/101908definitionofinaccessibilitylinkedserver.shtml