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

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

CREATE PROCEDURE [upDBTreeAddNode] 
    @idDBTree INT,
    @idParent INT,
    @idPrior INT,
    @idNext INT,
    @Text VARCHAR(255),
    @idNode int = NULL out
AS
   DECLARE @Error INT
   SET @Error=0

   SET NOCOUNT ON
   -- Проверка параметров
   IF @idPrior IS NOT NULL 
    BEGIN
          DECLARE @idPriorNext int
          SELECT @idPriorNext=idNext FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idPrior
          IF @@ERROR<>0 SET @Error=@@ERROR
          IF @idNext<>@idPriorNext BEGIN
              SET NOCOUNT OFF
              RAISERROR ('Неправильно указаны параметры',16,1)
              RETURN 1
          END
    END
   ELSE IF @idNext IS NOT NULL
    BEGIN
         DECLARE @idNextPrior int
         SELECT @idNextPrior=idPrior FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idNext
         IF @@ERROR<>0 SET @Error=@@ERROR
         IF @idPrior<>@idNextPrior BEGIN
             SET NOCOUNT OFF
             RAISERROR ('Неправильно указаны параметры',16,1)
             RETURN 2
         END
    END
   ELSE IF @idParent IS NOT NULL BEGIN
        DECLARE @idParentFirstChild int
        SELECT @idParentFirstChild=idFirstChild FROM DBTree WHERE idDBTree=@idDBTree AND idNode=@idParent
        IF @@ERROR<>0 SET @Error=@@ERROR
        IF @idParentFirstChild IS NOT NULL BEGIN 
             SET NOCOUNT OFF
             RAISERROR ('Неправильно указаны параметры',16,1)
             RETURN 3
        END
   END
   -- Добавдение нового узла 
   BEGIN TRAN
   IF @idNode IS NULL
     BEGIN
           INSERT DBTree (idDBTree,[Text],idParent,idPrior,idNext)  VALUES (@idDBTree,@Text,@idParent,@idPrior,@idNext) 
           IF @@ERROR<>0 SET @Error=@@ERROR
           SELECT @idNode=@@IDENTITY 
           IF @@ERROR<>0 SET @Error=@@ERROR
     END
   ELSE BEGIN
           SET IDENTITY_INSERT NewData..DBTree ON
           IF @@ERROR<>0 SET @Error=@@ERROR
           INSERT DBTree (idDBTree,[Text],idParent,idPrior,idNext,idNode)  VALUES (@idDBTree,@Text,@idParent,@idPrior,@idNext,@idNode) 
           IF @@ERROR<>0 SET @Error=@@ERROR
           SET IDENTITY_INSERT NewData..DBTree  OFF
           IF @@ERROR<>0 SET @Error=@@ERROR
   END
   IF @idPrior IS NOT NULL 
        UPDATE DBTree SET idNext=@idNode WHERE idDBTree=@idDBTree  AND idNode=@idPrior
   IF @@ERROR<>0 SET @Error=@@ERROR
   IF @idNext IS NOT NULL 
        UPDATE DBTree SET idPrior=@idNode WHERE idDBTree=@idDBTree  AND idNode=@idNext
   IF @@ERROR<>0 SET @Error=@@ERROR
   IF @idParent IS NOT NULL  AND @idPrior IS NULL AND @idNext IS NULL
        UPDATE DBTree SET idFirstChild=@idNode WHERE idDBTree=@idDBTree AND idNode=@idParent 
   IF @@ERROR<>0 SET @Error=@@ERROR

   SET NOCOUNT OFF
   IF @Error=0 BEGIN
       COMMIT TRAN
       SELECT @idNode NewId
   END ELSE BEGIN
         ROLLBACK TRAN
         RETURN 4
   END


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