我正在使用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
答案 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,将其更改为自动编号,然后关闭自动编号和可为空。
(你可以跳过可以为空的步骤。)