Как вставить строки и переместить остальные вниз на основе номера порядка сортировки?

Как создать процедуру, которая вставляет запись в таблицу по порядку сортировки (столбец ранжирования), а остальные перемещает вниз. Например, мой sp получает входные данные PhysID(FK), UserID(FK),UserRoleID(FK), которые имеют ограничение, что они должны быть уникальной комбинацией, и последний вход, SortOrder, который определяет, где комбинация вставлена ​​в таблица и каждая запись после этого порядка сортировки перемещаются вниз (или добавляют 1 к порядку сортировки), чтобы освободить место для вставленной строки.

Есть три варианта ролей на физика. Каждому идентификатору пользователя разрешено заполнять любую из 3 ролей, но не более одной на физика. Каждый ролид имеет резервные идентификаторы на физ. Когда идентификатор пользователя используется для какой-либо роли с определенным физическим именем, этот идентификатор больше не является кандидатом на выбор.

После этого, как я могу вставить записи в соответствии с порядковым номером сортировки, который обновляет все записи с одинаковым или более высоким порядком сортировки, добавляя 1, перемещая их вниз в порядке сортировки.

Я очень новичок, так что не бей меня слишком сильно. Вот мой код

CREATE PROCEDURE dbo.SP_InsertRole 
    @PhysID int,
    @UserID int,
    @UserRoleID tinyint,
    @SortOrder int
AS
BEGIN TRANSACTION
    BEGIN TRY
    BEGIN   
        UPDATE dbo.Physicians_Users
        SET SortOrder = SortOrder + 1
        WHERE @PhysID = PhysicianID AND UserRoleID = @UserRoleID AND @SortOrder >= @SortOrder
    END
    BEGIN
        SELECT @UserID = UserID FROM dbo.Users 
        IF not exists(SELECT UserID FROM dbo.Physicians_User WHERE PhysiciansID = @PhysID AND @UserID = UserID)
        INSERT INTO dbo.Physicians_Users(PhysicianID,UserID,UserRoleID,SortOrder)
        VALUES(@PhysID,@UserID,@UserRoleID,@SortOrder)
    END
    COMMIT TRANSACTION
    END TRY
BEGIN CATCH
    SELECT @@ERROR
    ROLLBACK TRANSACTION
END CATCH

RETURN 0 

GO

2 ответа

Попробуйте этот SP

CREATE PROCEDURE dbo.SP_InsertRole 
@PhysID int,
@UserID int,
@UserRoleID tinyint,
@SortOrder int
AS
BEGIN TRANSACTION
  BEGIN TRY                    
    IF NOT EXISTS(
                  SELECT 1
                  FROM dbo.Physicians_User
                  WHERE PhysiciansID = @PhysID AND UserRoleID = @UserRoleID
                    AND UserID = @UserID
                  )
    BEGIN
      INSERT INTO dbo.Physicians_Users(PhysicianID, UserID, UserRoleID, SortOrder)
      VALUES (@PhysID, @UserID, @UserRoleID, @SortOrder)

      UPDATE dbo.Physicians_Users
      SET SortOrder = SortOrder + 1
      WHERE @PhysID = PhysicianID AND UserRoleID = @UserRoleID
        AND SortOrder >= @SortOrder
    END

    COMMIT TRANSACTION
  END TRY
BEGIN CATCH
  SELECT @@ERROR
  ROLLBACK TRANSACTION
END CATCH

RETURN 0 

GO

Попробуйте эти версии запроса. Я думаю, что вы путаете скалярные аргументы функции с именами столбцов:

BEGIN   
    UPDATE dbo.Physicians_Users
        SET SortOrder = SortOrder + 1
        WHERE @PhysID = PhysicianID AND UserRoleID = @UserRoleID AND
              SortOrder >= @SortOrder;   -- <-- this is the line that changed
END
BEGIN
    SELECT @UserID = UserID FROM dbo.Users;
    IF not exists(SELECT UserID
                  FROM dbo.Physicians_User
                  WHERE PhysiciansID = @PhysID AND @UserID = UserID)
    INSERT INTO dbo.Physicians_Users(PhysicianID,UserID,UserRoleID,SortOrder)
        VALUES(@PhysID,@UserID,@UserRoleID,@SortOrder)
END

Это исправляет синтаксис. Вы также можете выразить insert без if при выполнении:

    INSERT INTO dbo.Physicians_Users(PhysicianID,UserID,UserRoleID,SortOrder)
        select @PhysID, @UserID, @UserRoleID, @SortOrder
        where not exists(SELECT UserID
                  FROM dbo.Physicians_User
                  WHERE PhysiciansID = @PhysID AND @UserID = UserID)

Логика все еще не совсем верна. Если запись уже есть в таблице, зачем обновлять sortorder, И, если запись находится в таблице, вам, вероятно, следует обновить порядок сортировки для этой записи.

Другие вопросы по тегам