代码:
CREATE TABLE #Temp (T_ID INT IDENTITY(1,1), T_Desc NVARCHAR(10), PriorityOrder INT)
INSERT INTO #Temp
SELECT 'Apple',1
UNION
SELECT 'LG',2
UNION
SELECT 'Microsoft',3
UNION
SELECT 'Samsung',4
UNION
SELECT 'Sony',5
SELECT * FROM #Temp
DROP TABLE #Temp
输出:
T_ID T_Desc PriorityOrder
1 Apple 1
2 LG 2
3 Microsoft 3
4 Samsung 4
5 Sony 5
目标: 如果T_Desc值(即参数#1)向上/向下移动一行或多行,则重新排列PriortyOrder。 即如果LG从PriortyOrder 2转移到5(即参数#2),则新输出看起来像,
T_ID T_Desc PriorityOrder
1 Apple 1
2 LG 5
3 Microsoft 2
4 Samsung 3
5 Sony 4
换句话说,LG以下的所有内容都因“Priortyorder”字段向上移动。此外,如果索尼从PriorityOrder 5转移到1(在订单中向上移动),这应该可以。
T_ID T_Desc PriorityOrder
1 Apple 2
2 LG 3
3 Microsoft 4
4 Samsung 5
5 Sony 1
我已经看到移动/移位/重新排序的示例顺序向上/向下一行,但是无法确定多行的移位。
更新:列表的数据量可能会有所不同。
答案 0 :(得分:1)
Declare @srcID, @srcPri int, @dstPri int, @minPri int, @maxPri int, @delta
-- set @srcID and @dstPri as appropriate
Begin Transaction
Select @srcPri=PriorityOrder from #temp with (HOLDLOCK) where T_ID=@srcID
If @srcPri<@dstPri begin
Select @minPri=@srcPri+1,
@maxPri=@dstPri,
@delta=-1
End else begin
Select @minPri=@dstPri,
@maxPri=@srcPri-1,
@delta=1
End
Update #temp
Set PriorityOrder=PriorityOrder+@delta
Where PriorityOrder between @minPri and @maxPri
Update #temp
Set PriorityOrder=@dstPri
Where T_ID=@srcID
Commit Transaction
您需要在@srcID中提供要移动/移位的行的T_ID,并在@dstPri中提供目标PriorityOrder。如果同时运行上述代码的多个实例,如果两个实例都需要更新相同的记录,则可能会出现死锁