Это работало для меня в SQL Server 2008:
DECLARE @StartNumber int, @EndNumber int;
SET @StartNumber = 100;
SELECT @EndNumber = @StartNumber + COUNT(*) - 1 FROM SomeTable;
WITH numbers AS (
SELECT @StartNumber AS Value
UNION ALL
SELECT
Value + 1
FROM numbers
WHERE Value < @EndNumber
),
validnumbers AS (
SELECT
n.Value,
rownum = ROW_NUMBER() OVER (ORDER BY n.Value)
FROM numbers n
LEFT JOIN SomeTable t ON n.Value = t.Value
WHERE t.Value IS NULL
),
RowsToUpdate AS (
SELECT
Value,
rownum = ROW_NUMBER() OVER (ORDER BY Value)
FROM SomeTable
WHERE Value IS NULL
OR Value NOT IN (SELECT Value FROM numbers)
)
UPDATE r
SET Value = v.Value
FROM RowsToUpdate r
INNER JOIN validnumbers v ON v.rownum = r.rownum;
По сути, оно реализует следующие шаги:
Создание таблицы чисел.
Исключить числа, присутствующие в SomeTable
.
Ранжировать остальные строки.
Исключитьзначения из SomeTable
, присутствующие в числовой таблице.
Ранжирование остальных строк.
Обновление ранжированных строк SomeTable
из списка ранжированных номеров.
Не уверен, насколько хорошим будет это решение для больших таблиц, хотя ...