Предполагается, что вы находитесь на 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
);