TSQL Cascade удалить для дочерних записей? - PullRequest
1 голос
/ 14 ноября 2009

У меня есть структура таблицы родительский / дочерний стол (простое дерево) (ID, ParentID), где я хочу удалить (и получить идентификатор) всех дочерних элементов для данного родительского идентификатора - аналогично этому сообщению sql сервер, каскадное удаление и родительская / дочерняя таблица .

Во время цикла, где у меня есть текущий идентификатор, я также буду выполнять другие действия с этим идентификатором.

Может ли кто-нибудь дать мне пример SPROC для достижения этой цели?

Спасибо

1 Ответ

1 голос
/ 14 мая 2010

Предполагается, что вы находитесь на SQL SERVER 2005, вот пример хранимой процедуры для выполнения этого (с помощью 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

При этом удаляется строка, определенная параметром @id со всеми дочерними узлами из таблицы, и возвращает удаленные значения приложению обработки одним действием.

Вы также можете вернуть удаленные строки в табличную переменную (должна быть определена до CTE):

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

, а затем

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
);
...