3

如何创建一个按排序顺序(排名列)将记录插入表中并将其余部分向下移动的过程。例如,我的 sp 接收 , , 的输入,PhysID(FK)它们具有必须是唯一组合的约束,以及最后一个输入,它确定组合在表中的插入位置以及该排序顺序之后的每条记录向下移动(或将 1 添加到排序顺序)为插入的行腾出空间。UserID(FK)UserRoleID(FK)SortOrder

每个选项有 3 个roleid选项physid。每个userid人都可以担任 3 个角色中的任何一个,但每个角色不得超过一个physid。每个都有roleid备份useridphysid一旦 auserid被用于某个 physid 下的任何角色,它就userid不再是选择的候选对象。

完成后,如何根据排序顺序号插入记录,通过添加 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
4

2 回答 2

1

试试这个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
于 2013-05-26T07:15:22.097 回答
0

试试这些版本的查询。我认为您将函数的标量参数与列名混淆了:

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. 而且,如果记录在表中,您可能应该更新该记录的排序顺序。

于 2013-05-25T22:06:12.660 回答