2009-11-13 4 views
1

J'ai une structure de table parent/enfant (arbre simple) (ID, ParentID), où je veux supprimer (et obtenir l'ID de) tous les enfants pour un ID parent donné - similaire à cette publication sql server, cascade delete and parent/child table.TSQL Cascade delete pour les enregistrements enfants?

Pendant la boucle, où j'ai l'ID actuel, je vais également effectuer d'autres actions avec cet ID. Est-ce que quelqu'un peut me donner un exemple du SPROC pour accomplir ceci?

Merci

Répondre

1

En supposant, vous êtes sur SQL Server 2005, voici l'exemple de procédure stockée pour ce faire (en utilisant CTE):

CREATE PROCEDURE [DeleteRecordWithChild] 
    @id int 
AS 
BEGIN 
    WITH Nodes ([Id], [ParentId], [Level]) 
    AS (
     SELECT T.[Id], T.[ParentId], 0 AS [Level] 
     FROM [dbo].[YourTable] T 
     WHERE T.[Id] = @id 

     UNION ALL 

     SELECT T.[Id], T.[ParentId], N.[Level] + 1 
     FROM [dbo].[YourTable] T 
       INNER JOIN Nodes N ON N.[Id] = T.[ParentId] 
    ) 

    DELETE 
    FROM [YourTable] 
    OUTPUT deleted.* 
    WHERE [Id] IN (
     SELECT TOP 100 PERCENT N.[Id] 
     FROM Nodes N 
     ORDER BY N.[Level] DESC 
    ); 
END 

Cela supprime une ligne définie par @id paramètre avec tous les nœuds enfants de la table et renvoie les valeurs supprimées à l'application de traitement en une seule action.

Vous pouvez également revenir lignes supprimées dans une variable de table (à définir avant CTE):

DECLARE @deleted_rows TABLE 
(
    [Id] int, 
    [ParentId] int, 
    [Level] int 
); 

puis

DELETE 
FROM [YourTable] 
OUTPUT deleted.* INTO @deleted_rows 
WHERE [Id] IN (
    SELECT TOP 100 PERCENT N.[Id] 
    FROM Nodes N 
    ORDER BY N.[Level] DESC 
); 
Questions connexes