SQL Server存储过程ON DELETE

时间:2014-07-06 01:44:07

标签: sql sql-server stored-procedures

我有一个递归关系的表,它具有ID和ParentID的外键约束。

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

我没有强制执行外键约束,必须将CASCADING保留为无操作,因为它会导致循环级联(这就是我想要的)。当我删除一个有子节点的记录时,我仍然想自动删除它的所有子节点(即DELETE FROM MyTable WHERE ParentID = THIS_RECORD_I_JUST_DELETED)。这将以递归方式调用该过程,直到删除所有子项及其子项为止。

如何编写SQL Server过程来执行此操作。我知道有ON UPDATING或ON DELETING类型的条款,但是当我谷歌时它无法找到任何相关内容。

1 个答案:

答案 0 :(得分: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