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

-Tracy-McGrady- 2016-04-13 05:21:01
我有个存储过程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的时候的执行结果,如果是正常执行,或者是执行时抛出来的异常。也记录下来,请问怎么做?谢谢。
...全文
573 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
up up
-Tracy-McGrady- 2016-04-20
  • 打赏
  • 举报
回复
引用 13 楼 KanzakiOrange 的回复:
[quote=引用 11 楼 yangsh0722 的回复:] [quote=引用 10 楼 KanzakiOrange 的回复:] 如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题
没玩过这高端的技术[/quote] 你开那个查询窗口,右键有个使用sql profile进行跟踪的,如果有足够权限,可以看到你该会话里面执行的每一条语句,应该可以帮助你分析[/quote] 我大概搜了一下你说的这个sql profile,好像没对我这个问题没多大用,谢谢
Ginnnnnnnn 2016-04-19
  • 打赏
  • 举报
回复
引用 11 楼 yangsh0722 的回复:
[quote=引用 10 楼 KanzakiOrange 的回复:] 如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题
没玩过这高端的技术[/quote] 你开那个查询窗口,右键有个使用sql profile进行跟踪的,如果有足够权限,可以看到你该会话里面执行的每一条语句,应该可以帮助你分析
-Tracy-McGrady- 2016-04-19
  • 打赏
  • 举报
回复
-Tracy-McGrady- 2016-04-17
  • 打赏
  • 举报
回复
引用 10 楼 KanzakiOrange 的回复:
如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题
没玩过这高端的技术
LongRui888 2016-04-15
  • 打赏
  • 举报
回复
另外,是这样,你可以在 调用 你的存储过程的外层,加上try-catch,比如: begin try exec 你的存储过程 end try begin catch 记录错误 end catch
LongRui888 2016-04-15
  • 打赏
  • 举报
回复
建议可以用sql server里的调试功能,进行单步调试
Ginnnnnnnn 2016-04-15
  • 打赏
  • 举报
回复
如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题
-Tracy-McGrady- 2016-04-15
  • 打赏
  • 举报
回复
引用 6 楼 yupeigu 的回复:
建议可以用sql server里的调试功能,进行单步调试
不是每次都这样,所以也不好调啊。而且每次中间段了以后,在后台执行这个存储过程,没报任何错误就执行完成了。
-Tracy-McGrady- 2016-04-15
  • 打赏
  • 举报
回复
引用 7 楼 yupeigu 的回复:
另外,是这样,你可以在 调用 你的存储过程的外层,加上try-catch,比如: begin try exec 你的存储过程 end try begin catch 记录错误 end catch
哥,你看看我发的那两张图片,我已经这么干了,什么错误都抛不出来。就是while了一半然后就停了。
唐诗三百首 2016-04-14
  • 打赏
  • 举报
回复
检查各个相关的表上是否有触发器? 有些较隐蔽的问题是触发器导致的.
唐诗三百首 2016-04-14
  • 打赏
  • 举报
回复
可能是程序逻辑问题,需详细排查. 可以自定义一个日志表, 然后在存储过程代码中,执行到主要节点的地方插入一些辅助信息到日志表中, 方便分析详细的原因.
-Tracy-McGrady- 2016-04-14
  • 打赏
  • 举报
回复
引用 1 楼 ap0405140 的回复:
建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.



版主大哥,好像不行啊,截取不到错误信息,循环还是没执行完。
-Tracy-McGrady- 2016-04-14
  • 打赏
  • 举报
回复
引用 1 楼 ap0405140 的回复:
建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.
好的,我试试,谢谢版主
唐诗三百首 2016-04-13
  • 打赏
  • 举报
回复
建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧