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