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,将其更改为自动编号,然后关闭自动编号和可为空。

(您可以跳过可为空的步骤。)

于 2009-11-12T18:08:07.740 回答