Я пытаюсь написать рекурсивную процедуру, которая удалит узел и все его дочерние элементы, если они такие в таблице. Я пробовал сделать следующее:Удаление деревьев-узлов в таблице SQL
CREATE PROCEDURE DeleteFile
@FileID INTEGER,
@UserID VARCHAR(MAX)
AS
DELETE FROM [FileTree] WHERE [ID] = @FileID AND [UserID][email protected];
IF EXISTS(SELECT * FROM [FileTree] WHERE [ParentID] = @FileID AND [UserID][email protected])
BEGIN
DECLARE FileCursor CURSOR LOCAL FOR
SELECT [ID],[UserID] FROM [FileTree] WHERE [ParentID] = @FileID AND [UserID][email protected];
OPEN FileCursor
FETCH NEXT FROM FileCursor INTO @FileID , @UserID
WHILE @@FETCH_STATUS =0
BEGIN
EXEC DeleteFile @FileID,@UserID;
FETCH NEXT FROM FileCursor INTO @FileID , @UserID ;
END
END
ELSE
return
Но по какой-то причине это не работает. Он удаляет узел, но дети остаются. . Таблица ,, дизайн»
CREATE TABLE [FileTree] (
[ID] INT IDENTITY NOT NULL,
[Name] VARCHAR (MAX) NOT NULL,
[ParentID] INT NULL,
[UserID] VARCHAR (MAX) NOT NULL
);
Можете ли вы указать ошибки, которые я сделал и предложить рабочую процедуру UPD: Я сделал курсор LOCAL и я выборка один раз, прежде чем в то время цикла, его еще не удаляет всех детей
Я не знаю, почему ваш не работает, но я бы изучил использование рекурсивного CTE для получения всех идентификаторов родителя и удаления из таблицы, в которой идентификатор находится в CTE. Google «рекурсивный CTE» для множества примеров. –