sql server while 循环中一个奇怪的现象

时间:2022-12-13 14:36:22
我有个存储过程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的时候的执行结果,如果是正常执行,或者是执行时抛出来的异常。也记录下来,请问怎么做?谢谢。

16 个解决方案

#1


建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.

#2


引用 1 楼 ap0405140 的回复:
建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.

好的,我试试,谢谢版主

#3


引用 1 楼 ap0405140 的回复:
建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.

sql server while 循环中一个奇怪的现象
sql server while 循环中一个奇怪的现象
版主大哥,好像不行啊,截取不到错误信息,循环还是没执行完。

#4


检查各个相关的表上是否有触发器? 有些较隐蔽的问题是触发器导致的.

#5


可能是程序逻辑问题,需详细排查.
可以自定义一个日志表, 然后在存储过程代码中,执行到主要节点的地方插入一些辅助信息到日志表中, 方便分析详细的原因.

#6



建议可以用sql server里的调试功能,进行单步调试

#7



另外,是这样,你可以在 调用 你的存储过程的外层,加上try-catch,比如:

begin try

exec 你的存储过程
end try

begin catch
   记录错误
end catch

#8


引用 7 楼 yupeigu 的回复:
另外,是这样,你可以在 调用 你的存储过程的外层,加上try-catch,比如:

begin try

exec 你的存储过程
end try

begin catch
   记录错误
end catch

哥,你看看我发的那两张图片,我已经这么干了,什么错误都抛不出来。就是while了一半然后就停了。

#9


引用 6 楼 yupeigu 的回复:
建议可以用sql server里的调试功能,进行单步调试

不是每次都这样,所以也不好调啊。而且每次中间段了以后,在后台执行这个存储过程,没报任何错误就执行完成了。

#10


如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题

#11


引用 10 楼 KanzakiOrange 的回复:
如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题

没玩过这高端的技术

#12


sql server while 循环中一个奇怪的现象

#13


引用 11 楼 yangsh0722 的回复:
Quote: 引用 10 楼 KanzakiOrange 的回复:

如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题

没玩过这高端的技术

你开那个查询窗口,右键有个使用sql profile进行跟踪的,如果有足够权限,可以看到你该会话里面执行的每一条语句,应该可以帮助你分析

#14


引用 13 楼 KanzakiOrange 的回复:
Quote: 引用 11 楼 yangsh0722 的回复:

Quote: 引用 10 楼 KanzakiOrange 的回复:

如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题

没玩过这高端的技术

你开那个查询窗口,右键有个使用sql profile进行跟踪的,如果有足够权限,可以看到你该会话里面执行的每一条语句,应该可以帮助你分析

我大概搜了一下你说的这个sql profile,好像没对我这个问题没多大用 sql server while 循环中一个奇怪的现象,谢谢

#15


卤煮你好,我现在也遇到了这种情况. 有个while循环 . 循环了100次  就不执行了, 后面sql也不执行. try catch 也不执行. 你后来这个问题处理了吗

#16


up  up sql server while 循环中一个奇怪的现象

#1


建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.

#2


引用 1 楼 ap0405140 的回复:
建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.

好的,我试试,谢谢版主

#3


引用 1 楼 ap0405140 的回复:
建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.

sql server while 循环中一个奇怪的现象
sql server while 循环中一个奇怪的现象
版主大哥,好像不行啊,截取不到错误信息,循环还是没执行完。

#4


检查各个相关的表上是否有触发器? 有些较隐蔽的问题是触发器导致的.

#5


可能是程序逻辑问题,需详细排查.
可以自定义一个日志表, 然后在存储过程代码中,执行到主要节点的地方插入一些辅助信息到日志表中, 方便分析详细的原因.

#6



建议可以用sql server里的调试功能,进行单步调试

#7



另外,是这样,你可以在 调用 你的存储过程的外层,加上try-catch,比如:

begin try

exec 你的存储过程
end try

begin catch
   记录错误
end catch

#8


引用 7 楼 yupeigu 的回复:
另外,是这样,你可以在 调用 你的存储过程的外层,加上try-catch,比如:

begin try

exec 你的存储过程
end try

begin catch
   记录错误
end catch

哥,你看看我发的那两张图片,我已经这么干了,什么错误都抛不出来。就是while了一半然后就停了。

#9


引用 6 楼 yupeigu 的回复:
建议可以用sql server里的调试功能,进行单步调试

不是每次都这样,所以也不好调啊。而且每次中间段了以后,在后台执行这个存储过程,没报任何错误就执行完成了。

#10


如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题

#11


引用 10 楼 KanzakiOrange 的回复:
如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题

没玩过这高端的技术

#12


sql server while 循环中一个奇怪的现象

#13


引用 11 楼 yangsh0722 的回复:
Quote: 引用 10 楼 KanzakiOrange 的回复:

如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题

没玩过这高端的技术

你开那个查询窗口,右键有个使用sql profile进行跟踪的,如果有足够权限,可以看到你该会话里面执行的每一条语句,应该可以帮助你分析

#14


引用 13 楼 KanzakiOrange 的回复:
Quote: 引用 11 楼 yangsh0722 的回复:

Quote: 引用 10 楼 KanzakiOrange 的回复:

如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题

没玩过这高端的技术

你开那个查询窗口,右键有个使用sql profile进行跟踪的,如果有足够权限,可以看到你该会话里面执行的每一条语句,应该可以帮助你分析

我大概搜了一下你说的这个sql profile,好像没对我这个问题没多大用 sql server while 循环中一个奇怪的现象,谢谢

#15


卤煮你好,我现在也遇到了这种情况. 有个while循环 . 循环了100次  就不执行了, 后面sql也不执行. try catch 也不执行. 你后来这个问题处理了吗

#16


up  up sql server while 循环中一个奇怪的现象