您的位置:首页 > 其它

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

2009-04-28 13:53 302 查看
----------------------------------------------------------------------------------
-- 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 行受影响)
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: