存储过程的结构大概是这样的
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
好的,我试试,谢谢版主
#3
版主大哥,好像不行啊,截取不到错误信息,循环还是没执行完。
#4
检查各个相关的表上是否有触发器? 有些较隐蔽的问题是触发器导致的.
#5
可能是程序逻辑问题,需详细排查.
可以自定义一个日志表, 然后在存储过程代码中,执行到主要节点的地方插入一些辅助信息到日志表中, 方便分析详细的原因.
可以自定义一个日志表, 然后在存储过程代码中,执行到主要节点的地方插入一些辅助信息到日志表中, 方便分析详细的原因.
#6
建议可以用sql server里的调试功能,进行单步调试
#7
另外,是这样,你可以在 调用 你的存储过程的外层,加上try-catch,比如:
begin try
exec 你的存储过程
end try
begin catch
记录错误
end catch
#8
哥,你看看我发的那两张图片,我已经这么干了,什么错误都抛不出来。就是while了一半然后就停了。
#9
不是每次都这样,所以也不好调啊。而且每次中间段了以后,在后台执行这个存储过程,没报任何错误就执行完成了。
#10
如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题
#11
没玩过这高端的技术
#12
#13
你开那个查询窗口,右键有个使用sql profile进行跟踪的,如果有足够权限,可以看到你该会话里面执行的每一条语句,应该可以帮助你分析
#14
如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题
没玩过这高端的技术
你开那个查询窗口,右键有个使用sql profile进行跟踪的,如果有足够权限,可以看到你该会话里面执行的每一条语句,应该可以帮助你分析
我大概搜了一下你说的这个sql profile,好像没对我这个问题没多大用 ,谢谢
#15
卤煮你好,我现在也遇到了这种情况. 有个while循环 . 循环了100次 就不执行了, 后面sql也不执行. try catch 也不执行. 你后来这个问题处理了吗
#16
up up
#1
建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.
#2
建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.
好的,我试试,谢谢版主
#3
建议在p_proc_2中添加try...catch.., 把详细的错误信息(如error_message())记录下来.
版主大哥,好像不行啊,截取不到错误信息,循环还是没执行完。
#4
检查各个相关的表上是否有触发器? 有些较隐蔽的问题是触发器导致的.
#5
可能是程序逻辑问题,需详细排查.
可以自定义一个日志表, 然后在存储过程代码中,执行到主要节点的地方插入一些辅助信息到日志表中, 方便分析详细的原因.
可以自定义一个日志表, 然后在存储过程代码中,执行到主要节点的地方插入一些辅助信息到日志表中, 方便分析详细的原因.
#6
建议可以用sql server里的调试功能,进行单步调试
#7
另外,是这样,你可以在 调用 你的存储过程的外层,加上try-catch,比如:
begin try
exec 你的存储过程
end try
begin catch
记录错误
end catch
#8
另外,是这样,你可以在 调用 你的存储过程的外层,加上try-catch,比如:
begin try
exec 你的存储过程
end try
begin catch
记录错误
end catch
哥,你看看我发的那两张图片,我已经这么干了,什么错误都抛不出来。就是while了一半然后就停了。
#9
建议可以用sql server里的调试功能,进行单步调试
不是每次都这样,所以也不好调啊。而且每次中间段了以后,在后台执行这个存储过程,没报任何错误就执行完成了。
#10
如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题
#11
如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题
没玩过这高端的技术
#12
#13
如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题
没玩过这高端的技术
你开那个查询窗口,右键有个使用sql profile进行跟踪的,如果有足够权限,可以看到你该会话里面执行的每一条语句,应该可以帮助你分析
#14
如果不怕麻烦。可以用profile来跟踪一下实际的语句自行情况。看看是哪里出现的问题
没玩过这高端的技术
你开那个查询窗口,右键有个使用sql profile进行跟踪的,如果有足够权限,可以看到你该会话里面执行的每一条语句,应该可以帮助你分析
我大概搜了一下你说的这个sql profile,好像没对我这个问题没多大用 ,谢谢
#15
卤煮你好,我现在也遇到了这种情况. 有个while循环 . 循环了100次 就不执行了, 后面sql也不执行. try catch 也不执行. 你后来这个问题处理了吗
#16
up up