Еще один артефакт режима неявных транзакций, который для использующих подобный шаблон хранимок, может стать сюрпризом:
use tempdb;
go
create procedure dbo.spTest
as
begin
declare @tc int = @@trancount;
if @tc = 0
begin tran;
begin try
select 'inner', @@trancount;
if @tc = 0 and @@trancount > 0
commit;
end try
begin catch
if @tc = 0 and @@trancount > 0
rollback;
end catch;
end;
go
if @@trancount > 0
rollback;
set implicit_transactions on;
select 'outer', @@trancount;
exec dbo.spTest;
select 'outer', @@trancount;
if @@trancount > 0
rollback;
set implicit_transactions off;
go
drop procedure dbo.spTest;
Наличие открытой транзакции после вызова процедуры в принципе объяснимо. Но где тогда ошибка 266?