Я работаю над хранимой процедурой в SQL Server 2008 для сброса целочисленного столбца в таблице базы данных. Этот целочисленный столбец хранит или сохраняет порядок отображения строк элемента. Пользователи могут перетаскивать элементы в определенном порядке сортировки, и мы сохраняем этот порядок в таблице базы данных, используя это "Порядок ранга целое" .
При отображении запросов к элементам всегда добавляется "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
Эти дубликаты в основном из-за вставок и пользовательских номеров заказа. Мы не пытаемся предотвратить повторяющиеся ранги заказов, но нам нужен способ «исправить» таблицу при добавлении / изменении элемента.
Можно ли как-то сбросить столбец OrderRankInt с помощью одного запроса UPDATE?
Или мне нужно использовать курсор? Как будет выглядеть синтаксис этого курсора?
Спасибо,
Kervin
EDIT
Обновление с помощью 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