none
请教一个sql2000递归删除数据的存储过程 RRS feed

  • 问题

  • 我的表如下,实现的是一个下拉框
    --------------------------
      Tid, Tname , Tpid
      1 电子数码 0  
      2 电脑 1
      3 硬件 2
      4 主板 3
      5 相机 1
      6 佳能 5
    ---------------------------
    假设我现在批量删除了"硬件"和"相机"。则"主板"不是删掉,而是父级变成了"电脑","佳能"的父级则成了"电子数码",
    请问我存储过程该怎么写,谢谢了.或者我该怎么设计主外键关系?
    2010年7月15日 2:39

答案

  • create table test 
    ( 
    Tid int, Tname varchar(20), Tpid int)
    insert test select 
     1, '电子数码', 0 union all select  
     2, '电脑', 1  union all select  
     3, '硬件', 2  union all select
     4, '主板', 3  union all select
     5, '相机', 1  union all select
     6, '佳能', 5
    go
    create trigger trDelT on test
    after delete 
    as
    begin 
    	update test
    	set Tpid=d.Tpid
      from deleted d 
      where d.Tid=test.Tpid
    end
    go
    delete test where Tname in ('硬件','相机')
    go
    select * from test ;
    go
    drop table test;
    /*
    Tid     Tname        Tpid
    ----------- -------------------- -----------
    1      电子数码         0
    2      电脑          1
    4      主板          2
    6      佳能          1*/
    
    
    2010年7月15日 5:27
  • use Tempdb
    go
    --> -->
     
    if not object_id(N'Ta') is null
      drop table Ta
    Go
    Create table Ta([Tid] int,[Tname] nvarchar(4),[Tpid] int)
    Insert Ta
    select 1,N'电子数码',0 union all
    select 2,N'电脑',1 union all
    select 3,N'硬件',2 union all
    select 4,N'主板',3 union all
    select 5,N'相机',1 union all
    select 6,N'佳能',5
    Go
    
    CREATE PROCEDURE dTa(
    @TID INT --參數以TID為例
    )
    AS
    SET NOCOUNT ON ;
    BEGIN
      UPDATE B
      SET [Tpid]=a.[Tpid]
      FROM Ta a
        INNER JOIN Ta b ON a.[Tid]=b.[Tpid]
      WHERE a.TID=@TID
    
      DELETE Ta WHERE TID=@TID
    
    END
    go
    
    EXEC dTa @TID=3 --硬件
    EXEC dTa @TID=5 --相机
    go
    SELECT * FROM ta
    /*
    Tid  Tname  Tpid
    1  电子数码  0
    2  电脑  1
    4  主板  2
    6  佳能  1
    */
    


    ROY WU(吳熹)
    • 已建议为答案 l915817 2010年7月21日 7:17
    • 已标记为答案 Gabriel_Carl 2010年7月21日 14:02
    2010年7月15日 9:43
    版主

全部回复

  • 步骤:

    1.update tpid等于要删除的数据tid的记录的tpid为删除记录的tpid。

    2.删除要删除的数据。

    第一步比较拗口,伪代码如下

    --假设取一条

    select top 1 @deletetpid=tpid,@deletepid=pid from tablename where 删除条件

    update tablename set tpid=@deletetpid where tpid=@deletepid  --这里就把 主板 的tpid 3 更新为 硬件 的tpid 2 ,使父子关系继续。。。

    --delete数据

    delete tablename where 删除条件


    family as water
    2010年7月15日 3:18
  • 参考一下查询递归,就容易实现删除递归了
    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    2010年7月15日 4:15
  • 控制一下, 通过注标, 一次性删除一个, 问题就很容易解决了.
    2010年7月15日 4:39
  • create table test 
    ( 
    Tid int, Tname varchar(20), Tpid int)
    insert test select 
     1, '电子数码', 0 union all select  
     2, '电脑', 1  union all select  
     3, '硬件', 2  union all select
     4, '主板', 3  union all select
     5, '相机', 1  union all select
     6, '佳能', 5
    go
    create trigger trDelT on test
    after delete 
    as
    begin 
    	update test
    	set Tpid=d.Tpid
      from deleted d 
      where d.Tid=test.Tpid
    end
    go
    delete test where Tname in ('硬件','相机')
    go
    select * from test ;
    go
    drop table test;
    /*
    Tid     Tname        Tpid
    ----------- -------------------- -----------
    1      电子数码         0
    2      电脑          1
    4      主板          2
    6      佳能          1*/
    
    
    2010年7月15日 5:27
  • use Tempdb
    go
    --> -->
     
    if not object_id(N'Ta') is null
      drop table Ta
    Go
    Create table Ta([Tid] int,[Tname] nvarchar(4),[Tpid] int)
    Insert Ta
    select 1,N'电子数码',0 union all
    select 2,N'电脑',1 union all
    select 3,N'硬件',2 union all
    select 4,N'主板',3 union all
    select 5,N'相机',1 union all
    select 6,N'佳能',5
    Go
    
    CREATE PROCEDURE dTa(
    @TID INT --參數以TID為例
    )
    AS
    SET NOCOUNT ON ;
    BEGIN
      UPDATE B
      SET [Tpid]=a.[Tpid]
      FROM Ta a
        INNER JOIN Ta b ON a.[Tid]=b.[Tpid]
      WHERE a.TID=@TID
    
      DELETE Ta WHERE TID=@TID
    
    END
    go
    
    EXEC dTa @TID=3 --硬件
    EXEC dTa @TID=5 --相机
    go
    SELECT * FROM ta
    /*
    Tid  Tname  Tpid
    1  电子数码  0
    2  电脑  1
    4  主板  2
    6  佳能  1
    */
    


    ROY WU(吳熹)
    • 已建议为答案 l915817 2010年7月21日 7:17
    • 已标记为答案 Gabriel_Carl 2010年7月21日 14:02
    2010年7月15日 9:43
    版主