Сбросить или обновить целое положение строки в таблице базы данных - PullRequest
3 голосов
/ 12 ноября 2009

Я работаю над хранимой процедурой в 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

Ответы [ 2 ]

5 голосов
/ 12 ноября 2009
with cte as (
 select OrderId, row_number() over (order by Name) as rn
 from Table)
update cte
 set OrderId = rn;

Это не относится к каким-либо отношениям с внешними ключами, надеюсь, вы позаботились об этом.

2 голосов
/ 12 ноября 2009

Поддельные. Сделайте столбец обнуляемым, установите значения в NULL, измените его на автоматический номер, а затем отключите автоматический номер и обнуляемый.

(Вы можете пропустить пустые шаги.)

...