4

データベース テーブルの整数列をリセットするために、SQL Server 2008 でストアド プロシージャに取り組んでいます。この整数列は、項目行の表示順序を格納または保持します。ユーザーは特定の並べ替え順序で項目をドラッグ アンド ドロップでき、この"Order Rank Integer"を使用してデータベース テーブルにその順序を保持します。

アイテムの表示クエリは、データを取得するときに常に「ORDER BY OrderRankInt」を追加して、ユーザーが以前に指定した順序でアイテムを表示するようにします。

問題は、テーブル項目が少し並べ替えられた後、この整数列が多くの重複値を収集することです。したがって...

Table
--------
Name | OrderRankInt
a    | 1
b    | 2
c    | 3
d    | 4
e    | 5
f    | 6

ユーザーによる多くの再注文の後、....

Table
--------
Name | OrderRankInt
a    | 1
b    | 2
c    | 2
d    | 2
e    | 2
f    | 6

これらの重複は、主に挿入とユーザー指定の注文番号が原因です。注文ランクの重複を防ごうとしているわけではありませんが、アイテムの挿入/変更に関する表を「修正」する方法が必要です。

単一の UPDATE クエリでOrderRankInt列をリセットする方法はありますか? または、カーソルを使用する必要がありますか? そのカーソルの構文はどのようになりますか?

ありがとう、ケルビン

編集

Remus Rusanuソリューションで更新します。ありがとう!!

CREATE PROCEDURE EPC_FixTableOrder
@sectionId int = 0
AS
BEGIN

-- "Common Table Expression" to append a 'Row Number' to the table
WITH tempTable AS 
(
    SELECT OrderRankInt, ROW_NUMBER() OVER (ORDER BY OrderRankInt) AS rn
    FROM dbo.[Table]
    WHERE sectionId = @sectionId -- Fix for a specified section
)
UPDATE tempTable        
SET OrderRankInt = rn;  -- Set the Order number to the row number via CTE

END
GO
4

2 に答える 2

5
with cte as (
 select OrderId, row_number() over (order by Name) as rn
 from Table)
update cte
 set OrderId = rn;

これは外部キー関係を考慮していません。

于 2009-11-12T18:15:37.443 に答える
2

ごまかす。列を NULL 可能にし、値を NULL に設定し、それを自動付番に変更してから、自動付番と Null 可能をオフにします。

(null 可能な手順をスキップできます。)

于 2009-11-12T18:08:07.740 に答える