Хранимая процедура upDBTreeMoveNode
Процедура помещает заданный узел перед указанным,если @AsChild=0.
Если @AsChild<>0, то узел добавляется в список дочерних узлов к указанному последним.
Перед перемещением производится проверка на наличие заданных узлов.А также проверка на то, что перемещаемый узел не является родителем для целевого узла.
CREATE PROCEDURE [upDBTreeMoveNode]
@idDBTree INT,
@idDNode INT,
@idSNode INT,
@AsChild INT=0
AS
IF @idDNode=@idSNode
RETURN 0
DECLARE @ErMsg VARCHAR(255)
DECLARE @Error INT
SET @Error=0
IF NOT Exists(SELECT * FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idDNode) BEGIN
SET @ErMsg='Нет перемещаемого узла '+convert(varchar(10),@idDNode)
RAISERROR (@ErMsg,16,1)
RETURN 1
END
IF @@ERROR<>0 SET @Error=@@ERROR
IF NOT Exists(SELECT * FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idSNode) BEGIN
SET @ErMsg='Нет конечного узла '+convert(varchar(10),@idSNode)
RAISERROR (@ErMsg,16,1)
RETURN 2
END
IF @@ERROR<>0 SET @Error=@@ERROR
DECLARE @idDPrior int,@idDNext int,@idDParent int,@idDFirstChild int
DECLARE @idSPrior int,@idSNext int,@idSParent int
SELECT @idDPrior=idPrior,@idDNext=idNext,@idDParent=idParent,@idDFirstChild=idFirstChild FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idDNode
IF @@ERROR<>0 SET @Error=@@ERROR
SELECT @idSPrior=idPrior,@idSNext=idNext,@idSParent=idParent FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idSNode
IF @@ERROR<>0 SET @Error=@@ERROR
IF @AsChild<>0 OR @idSNext IS NULL OR @idSNext<>@idDNode BEGIN --если надо что-то делать
-- проверка,что перемещаемый узел не является родителем для целевого узла
DECLARE @idParent INT
SET @idParent=@idDParent
WHILE @idParent IS NOT NULL AND @idParent<>@idSNode BEGIN
SELECT @idParent=idParent FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idParent
IF @@ERROR<>0 SET @Error=@@ERROR
END
IF @idParent IS NOT NULL BEGIN
RAISERROR ('Исходный узел является предком целевого узла',16,1)
RETURN 3
END
--перемещение узла
BEGIN TRAN
--убираем со старого места
DECLARE @CanMove INT
EXEC @CanMove=upDBTreeRemoveNode @idDBTree,@idSNode
IF @@ERROR<>0 SET @Error=@@ERROR
IF @CanMove=0 BEGIN -- ставим на новое место
IF @AsChild=0 -- Перед целевым узлом
BEGIN
IF @idDPrior IS NULL
BEGIN
UPDATE DBTree SET idFirstChild=@idSNode WHERE idDBTree=@idDBTree AND idNode=@idDParent
IF @@ERROR<>0 SET @Error=@@ERROR
END
ELSE BEGIN
UPDATE DBTree SET idNext=@idSNode WHERE idDBTree=@idDBTree AND idNode=@idDPrior
IF @@ERROR<>0 SET @Error=@@ERROR
END
UPDATE DBTree SET idPrior=@idDPrior,idNext=@idDNode,idParent=@idDParent WHERE idDBTree=@idDBTree AND idNode=@idSNode
IF @@ERROR<>0 SET @Error=@@ERROR
UPDATE DBTree SET idPrior=@idSNode WHERE idDBTree=@idDBTree AND idNode=@idDNode
IF @@ERROR<>0 SET @Error=@@ERROR
END
ELSE BEGIN -- Последним в списке вложенных в целевой
IF @idDFirstChild IS NOT NULL
BEGIN
-- Поиск последнего
DECLARE @idNode INT,@idNext INT
SET @idNode=@idDFirstChild
SELECT @idNext=idNext FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idNode
IF @@ERROR<>0 SET @Error=@@ERROR
WHILE @idNext IS NOT NULL BEGIN
SET @idNode=@idNext
SELECT @idNext=idNext FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idNode
IF @@ERROR<>0 SET @Error=@@ERROR
END
-- Добавление
UPDATE DBTree SET idNext=@idSNode WHERE idDBTree=@idDBTree AND idNode=@idNode
IF @@ERROR<>0 SET @Error=@@ERROR
UPDATE DBTree SET idPrior=@idNode,idNext=NULL,idParent=@idDNode WHERE idDBTree=@idDBTree AND idNode=@idSNode
IF @@ERROR<>0 SET @Error=@@ERROR
END
ELSE BEGIN
UPDATE DBTree SET idFirstChild=@idSNode WHERE idDBTree=@idDBTree AND idNode=@idDNode
IF @@ERROR<>0 SET @Error=@@ERROR
UPDATE DBTree SET idPrior=NULL,idNext=NULL,idParent=@idDNode WHERE idDBTree=@idDBTree AND idNode=@idSNode
IF @@ERROR<>0 SET @Error=@@ERROR
END
END
IF @Error=0
COMMIT TRAN
ELSE BEGIN
ROLLBACK TRAN
RETURN 1
END
END ELSE BEGIN
ROLLBACK TRAN
RETURN 2
END
END
Сайт управляется системой
uCoz