2016-06-20 3 views
1

コード値のリストを並べ替え:T-SQLテーブルに

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を再配置します1つまたは複数の行を上下にシフトします。 LGは5(すなわち、パラメータ#2)にPriortyOrder 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 

Iは、アップ/ダウン移動/シフト/リシーケンシングオーダー1行の例を見てきましたが、複数の行を超えるシフト把握することができていません。

更新:リストのデータ量は異なります。あなたが移動する行のT_IDを提供する必要が

+0

T_Desc列の順序は保持されるべきですか? –

+1

PriorityOrderにギャップや重複がないことが保証されていますか? –

+0

「OriginalPriortyOrder」または「PrevPriortyOrder」列が必要で、それを並べ替えるだけのようです。 – JBrooks

答えて

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 [email protected] 

If @srcPri<@dstPri begin 
    Select @[email protected]+1, 
     @[email protected], 
     @delta=-1 
End else begin 
    Select @[email protected], 
     @[email protected], 
     @delta=1 
End 

Update #temp 
Set [email protected] 
Where PriorityOrder between @minPri and @maxPri 

Update #temp 
Set [email protected] 
Where [email protected] 

Commit Transaction 

は/ @srcIDとターゲット@dstPriでPriorityOrderにシフト。上記のコードの複数のインスタンスを同時に実行すると、両方のインスタンスが同じレコードを更新する必要がある場合、デッドロックが発生する可能性があります。

+0

これは動作し、今私はそれを理解しています。本当にありがとう!!! – 007