--处理的存储过程
create proc p_delete
@MenuID varchar(20) --要删除的MenuID
as
declare @pid varchar(20),@i int
select @i=len(@MenuID)-1,@pid=left(@MenuID,@i-1)+'%'
delete from 表 where MenuID=@MenuID
update 表 set MenuID=stuff(MenuID,@i,2
,right(99+cast(substring(MenuID,@i,2) as int),2))
where MenuID like @pid and MenuID>@MenuID
go--调用
exec p_delete '0201'
go

解决方案 »

  1.   

    create table 表(MenuID varchar(20) primary key,MenuName varchar(20))
    insert into 表
    select '01','梨'
    union all select '02','苹果'
    union all select '0201','苹果大儿子'
    union all select '0202','苹果二儿子'
    union all select '020201','苹果二儿子的儿子'
    union all select '0203','苹果三儿子'
    union all select '03','香蕉'
    go--处理的存储过程
    create proc p_delete
    @MenuID varchar(20) --要删除的MenuID
    as
    declare @pid varchar(20),@i int
    select @i=len(@MenuID)-1,@pid=left(@MenuID,@i-1)+'%'
    delete from 表 where MenuID=@MenuID
    update 表 set MenuID=stuff(MenuID,@i,2
    ,right(99+cast(substring(MenuID,@i,2) as int),2))
    where MenuID like @pid and MenuID>@MenuID
    go--调用
    exec p_delete '0201'
    go--显示处理结果
    select * from 表
    go--删除测试
    drop table 表
    drop proc p_delete
    go/*--测试结果
    MenuID               MenuName             
    -------------------- -------------------- 
    01                   梨
    02                   苹果
    0201                 苹果二儿子
    020101               苹果二儿子的儿子
    0202                 苹果三儿子
    03                   香蕉(所影响的行数为 6 行)
    --*/
      

  2.   

    --哈哈:--下面是触发器的,这样,楼主无论用什么方法删除表中的数据,处理都是自动的.
    --创建自动处理的触发器
    create trigger t_delete on 表
    for delete
    as
    update 表 set MenuID
    =stuff(a.MenuID,b.level,2
    ,right(99+cast(substring(a.MenuID,b.level,2) as int),2))
    from 表 a join(
    select MenuID=min(MenuID),level=len(MenuID)-1
    from deleted group by len(MenuID)-1
    ) b on a.MenuID like left(b.MenuID,len(b.MenuID)-2)+'%' and a.MenuID>b.MenuID
    go
      

  3.   

    --下面是用触发器的处理方法的测试create table 表(MenuID varchar(20) primary key,MenuName varchar(20))
    insert into 表
    select '01','梨'
    union all select '02','苹果'
    union all select '0201','苹果大儿子'
    union all select '0202','苹果二儿子'
    union all select '020201','苹果二儿子的儿子'
    union all select '0203','苹果三儿子'
    union all select '03','香蕉'
    go--创建自动处理的触发器
    create trigger t_delete on 表
    for delete
    as
    update 表 set MenuID
    =stuff(a.MenuID,b.level,2
    ,right(99+cast(substring(a.MenuID,b.level,2) as int),2))
    from 表 a join(
    select MenuID=min(MenuID),level=len(MenuID)-1
    from deleted group by len(MenuID)-1
    ) b on a.MenuID like left(b.MenuID,len(b.MenuID)-2)+'%' and a.MenuID>b.MenuID
    go--删除测试
    delete from 表 where MenuID='0201'
    go--显示处理结果
    select * from 表
    go--删除测试
    drop table 表
    drop proc p_delete
    go/*--测试结果
    MenuID               MenuName             
    -------------------- -------------------- 
    01                   梨
    02                   苹果
    0201                 苹果二儿子
    020101               苹果二儿子的儿子
    0202                 苹果三儿子
    03                   香蕉(所影响的行数为 6 行)
    --*/