Хранимая процедура upDBTreeGetChildren

   Процедура возвращает список вложенных узлов в заданный родительский узел с учетом порядка их следования в дереве.
   Если @idParent = NULL, то возвращается список узлов первого уровня в дереве.

CREATE PROCEDURE [upDBTreeGetChildren] 
   @idDBTree INT,
   @idParent INT = NULL
AS
   SET NOCOUNT ON
   --временная таблица для результата
   CREATE TABLE #TMP_Result (idDBTree int,idParent int,idNode int, idPrior int,idNext int, idFirstChild int,[Text] varchar(255))

   DECLARE @Text varchar(255),@idPrior int,@idNode int,@idNext int,@idFirstChild int,@NodeCount int
   DECLARE @ErMsg VARCHAR (255)
   --проверка первого узла
   SET @NodeCount=-1
   IF @idParent IS NULL
      SELECT @NodeCount=COUNT(*)  FROM DBTree  WHERE idDBTree=@idDBTree AND idParent IS NULL  AND idPrior IS NULL
   ELSE
      SELECT @NodeCount=COUNT(*)  FROM DBTree  WHERE idDBTree=@idDBTree AND idParent=@idParent AND idPrior IS NULL
   IF @NodeCount=-1
     BEGIN
            SET @ErMsg='Нет первого узла:'+convert(varchar(10),@idParent)
            RAISERROR (@ErMsg,16,1)
            RETURN 1
     END
   ELSE IF @NodeCount>1
     BEGIN
            SET @ErMsg='Несколько первых узлов:'+convert(varchar(10),@idNext)
            RAISERROR (@ErMsg,16,1)
            RETURN 2
     END
   ELSE IF @NodeCount=1 BEGIN
        --Добавляем первый узел
        IF @idParent IS NULL
            SELECT @idNode=idNode,@idPrior=idPrior,@idNext=idNext,@idFirstChild=idFirstChild,@Text=[Text] FROM DBTree WHERE idDBTree=@idDBTree AND idParent IS NULL  AND idPrior IS NULL
        ELSE
            SELECT @idNode=idNode,@idPrior=idPrior,@idNext=idNext,@idFirstChild=idFirstChild,@Text=[Text] FROM DBTree WHERE idDBTree=@idDBTree AND idParent=@idParent AND idPrior IS NULL
        INSERT #TMP_Result VALUES(@idDBTree,@idParent,@idNode,@idPrior,@idNext,@idFirstChild,@Text)
        --Добавляем остальные узлы
        DECLARE @idAddedNode INT
        SET @idAddedNode=@idNode
        WHILE @idNext IS NOT NULL BEGIN
            --проверка следующего узла
            IF @idParent IS NULL
                 SELECT @NodeCount=COUNT(*) FROM DBTree WHERE idDBTree=@idDBTree AND idParent IS NULL  AND idNode=@idNext
            ELSE
                 SELECT @NodeCount=COUNT(*) FROM DBTree WHERE idDBTree=@idDBTree AND idParent=@idParent AND idNode=@idNext
            IF @NodeCount=0
              BEGIN
                   SET @ErMsg='Нет следующего узла:'+convert(varchar(10),@idNext)
                   RAISERROR (@ErMsg,16,1)
                   RETURN 3
              END
            ELSE IF @NodeCount>1
              BEGIN
                   SET @ErMsg='Несколько следующих узлов:'+convert(varchar(10),@idNext)
                   RAISERROR (@ErMsg,16,1)
                   RETURN 4
              END
            ELSE IF @NodeCount=1 BEGIN
                 --добавление следующего узла
                 IF @idParent IS NULL
                     SELECT @idNode=idNode,@idPrior=idPrior,@idNext=idNext,@idFirstChild=idFirstChild,@Text=[Text] FROM DBTree WHERE idDBTree=@idDBTree AND idParent IS NULL  AND idNode=@idNext
                 ELSE
                     SELECT @idNode=idNode,@idPrior=idPrior,@idNext=idNext,@idFirstChild=idFirstChild,@Text=[Text] FROM DBTree WHERE idDBTree=@idDBTree AND idParent=@idParent AND idNode=@idNext
                 INSERT #TMP_Result VALUES(@idDBTree,@idParent,@idNode,@idPrior,@idNext,@idFirstChild,@Text)
                 IF @idAddedNode=@idNode 
                   BEGIN
                        SELECT * FROM #TMP_Result
                        SET @ErMsg='Зацикливание '+convert(varchar(10),@idNode)
                        RAISERROR (@ErMsg,16,1)
                        RETURN 5
                   END
                 ELSE SET @idAddedNode=@idNode
           END
       END
  END
  
  SET NOCOUNT OFF
  --вывод данных
  SELECT * FROM #TMP_Result
  --удаление временной таблицы
  SET NOCOUNT ON
  DROP TABLE #TMP_Result
  SET NOCOUNT OFF



Сайт управляется системой uCoz