懒猫接上题,上个问题解决了又有新问题
编译失败 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相同的值,当插入时会再另一个表加入一些数据。