如何创建一个按排序顺序(排名列)将记录插入表中并将其余部分向下移动的过程。例如,我的 sp 接收 , , 的输入,PhysID(FK)
它们具有必须是唯一组合的约束,以及最后一个输入,它确定组合在表中的插入位置以及该排序顺序之后的每条记录向下移动(或将 1 添加到排序顺序)为插入的行腾出空间。UserID(FK)
UserRoleID(FK)
SortOrder
每个选项有 3 个roleid
选项physid
。每个userid
人都可以担任 3 个角色中的任何一个,但每个角色不得超过一个physid
。每个都有roleid
备份userid
。physid
一旦 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