В приведенном коде в вызываемой процедуре bad возникает фатальная ошибка. В результате процедура 'снимается'
Code: Select all
create table TAB (a int)
go
create procedure bad
as
print 'xxx begin'
insert into TAB (a) select 666
-- fatal error here
create table #es (a int) insert into #es (b) select 1
insert into TAB (a) select 777
print 'xxx end'
go
create procedure up
as
begin transaction
declare @ret int
print 'up begin'
exec @ret=bad
if @ret>0 begin rollback transaction return end -- if some status returned
select @ret
insert into TAB (a) select 888
print 'up end'
commit transaction
go
exec up
select * from TAB
Но процедура up продолжается как ни в чем ни бывало !
Пoнятно что надо не далеть таких ошибок но я считаю что поведение достаточно опасно...
В реальной жизни часто вообще статусы возврата процедур на проверяют что конечно плохо
Но когда проверяют то проверяют часто вот так:
Code: Select all
declare @ret int
exec @ret=SomeProc
if @ret>0 begin ... something like rollback transaction...
В данном примере в случае фатальной ошибки в процедуре значение @ret не присваивается вообще. То есть поведение программы непредсказуемо и зависит от предыдущего значения ret. Правильно было бы написать
Code: Select all
declare @ret int
set @ret=NULL
exec @ret=SomeProc
if @ret>0 or @ret is NULL begin ... something like rollback transaction...
BOL молчаливо обходят этот вопрос.