Я бы сделал что-то немного отличное от splattne ...
SET NOCOUNT ON
DECLARE @MaxValue INT
DECLARE @Numbers table (
Number INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
)
SELECT @MaxValue = max(RangeValue) FROM MyTable
INSERT @Numbers DEFAULT VALUES
WHILE COALESCE(SCOPE_IDENTITY(), 0) <= @MaxValue
INSERT @Numbers DEFAULT VALUES
SELECT
t.startValue + n.Number
FROM
MyTable t
INNER JOIN
@Numbers n
ON n.Number < t.RangeValue
SET NOCOUNT OFF
Это сведет к минимуму количество строк, которое нужно вставить в переменную таблицы, а затем использовать объединение, чтобы «умножить» одну таблицу на другую ...
По характеру запроса таблица исходной таблицы не нуждается в индексации, но таблица «числа» должна иметь индекс (или первичный ключ). Кластерные индексы относятся к тому, как они хранятся на диске, поэтому я не могу видеть, что CLUSTERED здесь уместен, но я оставил его, как только что скопировал из Splattne.
(Большие объединения могут быть медленными, но все же намного быстрее, чем миллионы вставок.)