我有一个递归关系的表,它具有ID和ParentID的外键约束。
MyTable Schema
------------------
ID
Name
ParentID
我没有强制执行外键约束,必须将CASCADING保留为无操作,因为它会导致循环级联(这就是我想要的)。当我删除一个有子节点的记录时,我仍然想自动删除它的所有子节点(即DELETE FROM MyTable WHERE ParentID = THIS_RECORD_I_JUST_DELETED)。这将以递归方式调用该过程,直到删除所有子项及其子项为止。
如何编写SQL Server过程来执行此操作。我知道有ON UPDATING或ON DELETING类型的条款,但是当我谷歌时它无法找到任何相关内容。
答案 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