Хранимая процедура 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