2018-09-13
zelder
2018-09-19
13/09
2018

Пересортировка в таблице

Запрос

DECLARE @GroupID dtID, @ID int, @Prev_ID int
SET @GroupID = 'a9fe5d39-a5ca-4558-b030-64e4c1cf4d4b' -- некий ID группирующий из всей таблицы только необходимые (можно версию без этого)
SET @ID = 224 -- ID объекта, который перемещаем
SET @Prev_ID = 214 -- ID объекта, который будет ПРЕДЫДУЩИМ (т.е., до сортируемого)

-- узнаем сортировку объекта, над которым хотим быть
DECLARE @SortOrder dtInt
IF @Prev_ID > 0
SELECT @SortOrder = T.[SortOrder]
FROM [dbo].[tCMS_Test] T
WHERE T.[GroupId] = @GroupID AND T.[Id] = @Prev_ID
ELSE
SET @SortOrder = CASE WHEN @Prev_ID < 0 THEN 0 ELSE 1000000 END
-- перестраиваем
UPDATE [dbo].[tCMS_Test]
SET [SortOrder] = RESORTED.[SortOrder]
FROM
(SELECT TT.[Id], TT.[GroupId], ROW_NUMBER() OVER (ORDER BY
CASE
WHEN TT.[Id] = @ID
THEN ISNULL(@SortOrder, 0) + 5
ELSE TT.[SortOrder]
END ASC) * 10 AS SortOrder
FROM [dbo].[tCMS_Test] TT
WHERE TT.[GroupId] = @GroupID
) RESORTED
WHERE 
RESORTED.[GroupId] = [dbo].[tCMS_Test].[GroupId] 
AND RESORTED.[Id] = [dbo].[tCMS_Test].[Id]

Пример вывода


SELECT TOP 1000 [Id], [Text], [SortOrder] 
FROM [dbo].[tCMS_Test] 
WHERE GroupId = 'a9fe5d39-a5ca-4558-b030-64e4c1cf4d4b' 
ORDER BY [SortOrder] ASC








.