测试结果如下:
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'T_Menu')
DROP table T_Menu
GO
CREATE TABLE T_Menu(
MenuID int, --菜单ID
ParentMenuID int --父菜单ID
)
go
insert into T_Menu select 1,1
insert into T_Menu select 2,1
insert into T_Menu select 3,1
insert into T_Menu select 4,2
insert into T_Menu select 5,4
create proc del(@参数 int)
as
declare @tmp1 table (id int)
insert @tmp1 values (@参数)
while @@rowcount>0
insert @tmp1 select a.MenuID from T_Menu a,@tmp1 b where a.ParentMenuID=b.ID and a.MenuID not in (select ID from @tmp1)
delete T_Menu where MenuID in(select id from @tmp1)
go
yoki(小马哥) 的好像有点问题
测试如下:
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'T_Menu')
DROP table T_Menu
GO
CREATE TABLE T_Menu(
MenuID int, --菜单ID
ParentMenuID int --父菜单ID
)
go
insert into T_Menu select 1,1
insert into T_Menu select 2,1
insert into T_Menu select 3,1
insert into T_Menu select 4,2
insert into T_Menu select 5,4
go
create proc delTree (@ int)
as
declare @result varchar(1000)
set @result=cast(@ as varchar(10))
while exists (select 1 from T_Menu where ParentMenuID=@)
begin
select @result=@result+','+cast(MenuID as varchar(10)) ,@=MenuID
from T_Menu
where ParentMenuID=@
end
exec ('delete T_Menu where MenuID in (' +@result + ')')
go
呵呵,不好意思,yoki(小马哥),感觉上你的proc有问题,好像只能删除两级的树,
不过应该改过后还是可以用的。
txlicenhe(马可)
create trigger 触发器名 on t_Menu
For delete
As
delete T_Menu where ParentMenuID in (Select MenuID from deleted)
go
好像应该可以,但是测试结果跌掉我的眼镜。
测试如下:
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'T_Menu')
DROP table T_Menu
GO
CREATE TABLE T_Menu(
MenuID int, --菜单ID
ParentMenuID int --父菜单ID
)
go
insert into T_Menu select 1,null
insert into T_Menu select 2,1
insert into T_Menu select 3,1
insert into T_Menu select 4,2
insert into T_Menu select 5,4
create trigger deltrigger on T_Menu
for delete
As
delete T_Menu where ParentMenuID in (Select MenuID from deleted)
go
--不用递归,用下面的方法处理
declare @id int
set @id=1 --你要删除的菜单ID
--下面是删除处理
declare @t table(id int,le int)
declare @le int
set @le=0
insert into @t select menuid,@le from t_menu where menuid=@id
while @@rowcount>0
begin
set @le=@le+1
insert into @t select a.menuid,@le from t_menu a join @t b on a.ParentMenuID=b.id
where b.le=@le-1
end
delete from t_menu where menuid in(select id from @t)
测试如下:
CREATE TABLE T_Menu(
MenuID int, --菜单ID
ParentMenuID int --父菜单ID
)
go
insert into T_Menu select 1,null
insert into T_Menu select 2,1
insert into T_Menu select 3,1
insert into T_Menu select 4,2
insert into T_Menu select 5,4
go
create proc delTree (@ int)
as
declare @result varchar(1000)
set @result=cast(@ as varchar(10))
while exists (select 1 from T_Menu where ParentMenuID=@)
begin
select @result=@result+','+cast(MenuID as varchar(10)) ,@=MenuID
from T_Menu
where ParentMenuID=@
end
exec ('delete T_Menu where MenuID in (' +@result + ')')
go
create proc delTree (@ int)
as
declare @result varchar(1000)
set @result=cast(@ as varchar(10))
while exists (select 1 from T_Menu where ParentMenuID=@)
begin
select @result=@result+','+cast(MenuID as varchar(10)) ,@=MenuID
from T_Menu
where ParentMenuID=@
end
exec ('delete T_Menu where MenuID in (' +@result + ')')
go
insert @tmp1 values (@参数)
while @@rowcount>0
insert @tmp1 select a.MenuID from T_Menu a,@tmp1 b where a.ParentMenuID=b.ID and a.MenuID not in (select ID from @tmp1)
delete T_Menu where MenuID in(select id from @tmp1)