Хранимая процедура upDBTreeDeleteNodesByCondition
Процедура удаляет все узлы, не соответствующие указанному критерию и не
являющиеся родителем для узлов, удовлетворяющих заданному критерию.
Нужный критерий отбора узлов надо указать в двух местах в тексте процедуры
CREATE PROCEDURE [upDBTreeDeleteNodesByCondition]
@idDBTreeS INT = 100 , -- Идентификатор исходного дерева
@idDBTreeD INT = 200 -- Идентификатор нового дерева
AS
SET NOCOUNT ON
-- Проверка на наличие старых данных
IF EXISTS(SELECT * FROM DBTree WHERE idDBTree = @idDBTreeD) BEGIN
RAISERROR ('Новое дерево должно быть пустым' , 16 , 1)
RETURN 1
END
-- Копируем все узлы
SET IDENTITY_INSERT DBTree ON
INSERT DBTree (idDBTree , idNode , idParent , idFirstChild , idNext , idPrior , [Text])
SELECT @idDBTreeD , idNode , idParent , idFirstChild , idNext , idPrior , [Text]
FROM DBTree
WHERE idDBTree = @idDBTreeS
SET IDENTITY_INSERT DBTree OFF
DECLARE @idNode INT
WHILE EXISTS(SELECT * FROM DBTree WHERE idDBTree = @idDBTreeD
AND idFirstChild IS NULL
AND
-- ЗДЕСЬ НАДО УКАЗАТЬ ТРЕБУЕМОЕ УСЛОВИЕ, например:
NOT (idNode IN (SELECT idGroup FROM GroupDescript WHERE WWW=1))
)
BEGIN
DECLARE N CURSOR FOR
SELECT idNode FROM DBTree WHERE idDBTree = @idDBTreeD
AND idFirstChild IS NULL
AND
-- ЗДЕСЬ НАДО УКАЗАТЬ ТОЖЕ САМОЕ УСЛОВИЕ:
NOT (idNode IN (SELECT idGroup FROM GroupDescript WHERE WWW=1))
OPEN N
FETCH NEXT FROM N INTO @idNode
WHILE @@FETCH_STATUS=0 BEGIN
EXEC upDBTreeDeleteNode @idDBTreeD , @idNode
FETCH NEXT FROM N INTO @idNode
END
CLOSE N
DEALLOCATE N
END
SET NOCOUNT OFF
Сайт управляется системой
uCoz