2014-07-06 72 views
0

我有一个递归关系的表和ID和ParentID的外键约束。SQL Server存储过程ON删除

MyTable Schema 
------------------ 
ID 
Name 
ParentID 

我不是强制执行外键约束,必须级联离开任何操作,因为它会导致循环级联(这是我想要的)。当我删除一个有孩子的记录时,我仍然想要自动删除它的所有孩子(即DELETE FROM MyTable WHERE ParentID = THIS_RECORD_I_JUST_DELETED)。这将递归地调用该过程,直到所有的孩子和他们的孩子都被删除。

我该如何编写一个SQL Server过程来执行此操作。我知道有正在更新或正在删除类型的子句,但找不到任何与Google相关的内容。

+1

循环级联是危险的。我通常会避免它们。 –

+0

就我个人而言,我不会设计一个依赖sp或触发器进行分层更新的数据库。 –

回答

0

使用以下查询:

在此查询中,选择必须首先删除的所有行。然后更新parentId列,然后删除它们。

CREATE PROCEDURE DeleteRow(@Id INT) 
AS BEGIN 
    DECLARE @IdList TABLE(Id int) 

    ;WITH IdList(Id) AS (
     SELECT Id 
     FROM YourTable t 
     WHERE Id = @Id 

     UNION ALL 

     SELECT t.Id 
     FROM IdList 
     INNER JOIN YourTable t ON t.ParentId = IdList.Id 
    ) 

    BEGIN TRANSACTION 
    UPDATE YourTable 
    SET parentId = NULL 
    OUTPUT Inserted.Id INTO @IdList 
    WHERE Id IN(SELECT Id FROM IdList) 

    DELETE YourTable WHERE Id IN (SELECT Id FROM @IdList) 
    COMMIT TRANSACTION 
END