现在的位置: 首页 > 综合 > 正文

同步删除被删除节点的所有子节点(BOM节点删除)

2012年01月29日 ⁄ 综合 ⁄ 共 2506字 ⁄ 字号 评论关闭

----------------------------------------------------------------------------------

-- Author : htl258(Tony)

-- Date   : 2009-04-28 13:53:00

-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)

--          Jul  9 2008 14:43:34

--          Copyright (c) 1988-2008 Microsoft Corporation

--          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)

-- Blog   : http://blog.csdn.net/htl258

----------------------------------------------------------------------------------

IF OBJECT_ID('tb') IS NOT NULL

    DROP TABLE tb

GO

CREATE TABLE tb

(

    ID INT,

    Name VARCHAR(50),

    PID INT

)

GO

INSERT INTO tb

SELECT 1, 'A', 0 UNION ALL

SELECT 2, 'A1', 1 UNION ALL

SELECT 3, 'A2', 1 UNION ALL

SELECT 4, 'A3', 1 UNION ALL

SELECT 5, 'A21', 2 UNION ALL

SELECT 6, 'A31', 3 UNION ALL

SELECT 7, 'A211', 6 UNION ALL

SELECT 8, 'B', 0 UNION ALL

SELECT 9, 'B1', 8

GO

 

-- SQL2000以上版本写法

-- 删除处理触发器(同步删除被删除节点的所有子节点)

IF OBJECT_ID('tr_DelTree')>0

    DROP TRIGGER tr_DelTree

GO

CREATE TRIGGER tr_DelTree ON tb

FOR DELETE

AS

IF @@ROWCOUNT=0 RETURN --如果没有满足删除条件的记录,直接退出

-- 查找所有被删除节点的子节点

SET NOCOUNT ON

DECLARE @t TABLE(ID int,Level int)

DECLARE @Level int

SET @Level=1

INSERT @t SELECT a.ID,@Level

FROM tb a,deleted d

WHERE a.PID=d.ID

WHILE @@ROWCOUNT>0

BEGIN

    SET @Level=@Level+1

    INSERT @t

       SELECT a.ID,@Level

       FROM tb a,@t b

       WHERE a.PID=b.ID

           AND b.Level=@Level-1

END

DELETE a

FROM tb a,@t b

WHERE a.ID=b.ID

SET NOCOUNT OFF

GO

-- 删除一条记录测试:

DELETE tb WHERE id=2

-- 查询最终结果:

SELECT * FROM tb

/*

ID          Name                                               PID

----------- -------------------------------------------------- -----------

1           A                                                  0

3           A2                                                 1

4           A3                                                 1

6           A31                                                3

7           A211                                               6

8           B                                                  0

9           B1                                                 9

 

(7 行受影响)

*/

-- SQL2005以上版本

IF OBJECT_ID('tr_DelTree')>0

    DROP TRIGGER tr_DelTree

GO

CREATE TRIGGER tr_DelTree ON tb

FOR DELETE

AS

WITH t AS

(

    SELECT ID

    FROM DELETED

    UNION ALL

    SELECT a.ID

    FROM tb a

    JOIN t b

        ON  a.PID = b.id

)

DELETE tb

WHERE  EXISTS(

           SELECT 1

           FROM t

           WHERE id = tb.id

       )

GO

--删除一条记录测试:

DELETE tb WHERE id=1

--查询最终结果:

SELECT * FROM tb

/*

ID          Name                                               PID

----------- -------------------------------------------------- -----------

8           B                                                  0

9           B1                                                 8

 

(2 行受影响)

*/

抱歉!评论已关闭.