在数据库表中重置或更新行位置整数

时间:2009-11-12 17:59:06

标签: sql sql-server stored-procedures cursor

我正在使用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 列? 或者我需要使用光标吗?该光标的语法是什么样的?

谢谢, Kervin

修改

使用 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

2 个答案:

答案 0 :(得分:5)

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

这并不考虑任何外键关系,我希望你能得到这些关系。

答案 1 :(得分:2)

假装。使列可以为空,将值设置为NULL,将其更改为自动编号,然后关闭自动编号和可为空。

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