懒猫接上题,上个问题解决了又有新问题

编译失败 2006-12-23 06:41:12
上题http://community.csdn.net/Expert/topic/5251/5251274.xml?temp=.2267267

根据wzh1215(懒猫)的答案写了个存储过程如下,目的是级联删除子节点(同一表中)
create proc PDelChildren AS
GO

alter proc PDelChildren
@TableName nvarchar(255), --表名
@KeyField nvarchar(255), --主键字段
@ParentField nvarchar(255), --父键字段
@KeyValue int --要删除的主键值
with RECOMPILE,ENCRYPTION
as
set nocount on
declare @NewKey int,@tmp nvarchar(1000),@i int

set @tmp = 'delete from ' + @TableName + ' where ' + @KeyField + '=' + cast(@KeyValue as nvarchar(50))
exec(@tmp)

set @tmp = 'select 0 from ' + @TableName + ' where ' + @ParentField + '=' + cast(@KeyValue as nvarchar(50))
exec(@tmp)

set @i = @@rowcount
while @i > 0
begin
set @tmp = 'select top 1 @NewKey=' + @KeyField + ' from ' + @TableName
set @tmp = @tmp + ' where ' + @ParentField + '=' + cast(@KeyValue as nvarchar(50))
exec sp_executesql @tmp,N'@NewKey int output',@NewKey output
select @NewKey
exec PDelChildren @TableName,@KeyField,@ParentField,@NewKey
set @i = @i - 1
end
GO

经过调试能够正常运行,但我的本意是使用触发器让他自动删除,于是建了个触发器如下
create trigger TR_Modules_Del_Children on Modules with encryption
for delete as
set nocount on
declare @KeyValue int
select @KeyValue=ModuleID from deleted
exec PDelChildren 'Modules','ModuleID','ParentID',@KeyValue
GO
问题来了,如果在查询分析器中表格浏览中直接删除(Ctrl+Del),当删除有子项的行则正常(子项也顺利删除),但是当直接删除一项没有子项目的数据行时,查询分析器就无响应,估计进入了死循环,奇怪的是当使用SQL语句(delete from ....)删除没有子项的行时又是正常的,另外在企业管理器中也是正常的,是不是我的存储过程或触发器有错误,还有我这种做法是不是科学?

注:此表上还有其他触发器,当删除时会删除另一个表ModuleID相同的值,当插入时会再另一个表加入一些数据。
...全文
176 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
编译失败 2006-12-24
  • 打赏
  • 举报
回复
确实会有问题,只触发了一次,一般不会多行一起删除,但是会无响应不知道怎么回事
中国风 2006-12-24
  • 打赏
  • 举报
回复
楼主的触发器,如果就一次性删除多行就会出问题
用 instead of deleted 这个类型的触发器
编译失败 2006-12-24
  • 打赏
  • 举报
回复
调试了一下发现这触发器不对,在循环中加入如果超出循环数就退出。可我没发现语法有什么问题啊,况且用SQL语句删除又不会有问题,谁给解释解释啊!

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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