有这样一个存储过程,通过触发器运行它时就死了。没有商量……200分起(补充:再加50分!!!) (再补充:问题快要解决了,可是¥分给谁呢?) (200分)

  • 主题发起人 主题发起人 seeme0526
  • 开始时间 开始时间
S

seeme0526

Unregistered / Unconfirmed
GUEST, unregistred user!
有这样一个存储过程,通过触发器运行它时就死了。没有商量……200分起
CREATE PROCEDURE spdata AS
Delete From gcweb
Select wzbm,Sum(shsl-fhsl) As kcsl
Into #Sumgc
From gcszc
Group By wzbm
Insert Into gcweb
(wzbm,wzmc,ggxh,shsl,fhsl,kcsl)
Select A.wzbm,A.wzmc,A.ggxh,A.shsl,A.fhsl,B.kcsl
From gcszc A,#Sumgc B
Where A.wzbm=B.wzbm and A.jldate=(Select Max(jldate) From gcszc)
Select wzbm,wzmc,ggxh,shsl,fhsl,kcsl
From gcweb
Order By wzmc,ggxh
 
没有怎么细看,会不会是你的表太多,而且你下面两个Select根本没有用.你即没有将其select
into 到一个游标,那么这两行就是空执行.你干脆一个一个的试着来,不就知道是哪儿出了问题?
别人不熟悉你的表是什么结构,所以不好下判断.
下面这两行没有用,因为没有返回结果,空执行.问题也很有可能出在这儿.
Select A.wzbm,A.wzmc,A.ggxh,A.shsl,A.fhsl,B.kcsl
From gcszc A,#Sumgc B
Where A.wzbm=B.wzbm and A.jldate=(Select Max(jldate) From gcszc)
Select wzbm,wzmc,ggxh,shsl,fhsl,kcsl
From gcweb
Order By wzmc,ggxh
 
会不会你的存储过程又触发了触发器,造成循环调用
 
如果不需要的话,最好把触发器直接递归和间接递归取消。
sp_sboption 'recursive triggers',True --取消直接递归。
sp_configure 'nested triggers','0' --取消间接递归。

要不你用事件查看器跟踪一下存储过程的运行。
 
应该是死循环的原因造成的。
 
to Brave:请详细讲解一下,并提供解决方法。
to dixpox:为什么要取消递归?
不好意思,是很菜。
 
锁定了吧
 
直接递归—如果表table1有update触发器trigger1,当你用update语句更新table1时,
显然trigger1将触发,如果你的trigger1又对table1进行了update操作时,
那么trigger1还将被触发。呵呵,还有完没完?这即是直接递归。(也就是
xianjun所指的死循环吧。)
直接递归—如果表table1有一个insert触发器trigger1和一个update触发器trigger。
当你用insert语句对table1进行触发时,激活trigger1,如果在trigger1又
对table进行了update操作,那么trigger2随后被激活。呵呵,这时候trigger2
如果还要对table1进行insert的话,那不又是一个死循环?
 
谢谢doxpix的解释,我马上试一下,欢迎各位继续对此问题关注。
 
to doxpix:
是sp_sboption还是sp_dboption
 
to Pipi:多说几句
 
MD!手一抖就造成一个无法挽回的错误。
应该是spb_dboption。
 
其实我是在用这个存储过程向通过Web Assistant Wizard形成的网页提供数据。
现在出现一个问题,Wizard不能执行完成,提示:
Error 21268:[SQL-DMO]Row or column specified is outside the range of the specified query result set.
我使用了一个网页模板文件。
该如何解决呢?
 
我看了这段代码,没有什么错。只是你一定是放错了地方,再仔细考虑一下,你到底是用那一个表的数据来更新网页。
 
进入了死循环了!
 
可能是递归后没有出口了,所以造成死机
 
接受答案了.
 
后退
顶部