Ich würde etwas anderes machen als 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
Dadurch wird die Anzahl der Zeilen, die Sie in die Tabellenvariable einfügen müssen, minimiert, und Sie können dann einen Join verwenden, um eine Tabelle mit der anderen zu "multiplizieren"...
Aufgrund der Art der Abfrage muss die Tabelle der Quelltabelle nicht indiziert werden, aber die Tabelle "Zahlen" sollte einen Index (oder Primärschlüssel) haben. Geclusterte Indizes beziehen sich darauf, wie sie auf der Festplatte gespeichert werden, daher sehe ich nicht, dass CLUSTERED hier relevant ist, aber ich habe es drin gelassen, da ich gerade von Splattne kopiert habe.
(Große Verbindungen wie diese sind zwar langsam, aber immer noch viel schneller als Millionen von Einfügungen).