2014-07-06 69 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