我有个存储过程p_proc_1,里面写了个while循环,循环体里面调用了另一个存储过程p_proc_2,p_proc_2里面有个select @sm as sm就是执行p_proc_2时候的一个说明。
存储过程的结构大概是这样的
create p_proc_1(参数列表)
as
begin
……
insert into pjcs(lszh,flag_1,flag_2) select lszh,'n','n' from tb where ...
declare @lszh int
while exists(select lszh from pjcs where flag_2='n')
begin
select top 1 @lszh=lszh from pjcs where flag_2='n'
update pjcs set flag_1='y' where lszh=@lszh
exec p_proc_2
update pjcs set flag_2='y' where lszh=@lszh
end
……
end
就这么一个简单的循环,我在前台代码中调用p_proc_1执行的时候,发现跟踪表pjcs插入的记录行数是正确的,比如一次insert了10个lszh,但是执行的时候表里面的flag_1.flag_2没有完全修改,也就是说while循环没完全执行完成。
后来我在p_proc_1里面加了个begin tran,commit tran,结果存储过程p_proc_1全部回滚了。相应的pjcs表中直接没数据。
所以,我怀疑是p_proc_2执行的时候报错了。但是我单独把while循环的那段代码拿出来在后台sql server里面执行是没有任何问题的。这个现象已经出现了很多次了,所以也不是偶然。
现在我的想法是,p_proc_1其他语句执行的时候影响了我while循环体的p_proc_2的执行,首次执行的时候p_proc_2会报错。我想在循环体里面执行p_proc_2的时候吧select 出来的@sm值存储下来。还有在执行p_proc_2的时候的执行结果,如果是正常执行,或者是执行时抛出来的异常。也记录下来,请问怎么做?谢谢。