Wie bereits erwähnt, liegt dies daran, dass Sie die Anzahl der Zeilen von sys.columns
erreicht haben . Hier ist eine andere Möglichkeit, eine Liste mit Zahlen zu erstellen, oder was andere als Numbers Table
bezeichnen oder Tally Table
.
Dies verwendet kaskadierten CTE
s und soll der schnellste Weg sein, eine Tally Table zu erstellen:
DECLARE @Range AS INT = 7374
;WITH E1(N) AS( -- 10 ^ 1 = 10 rows
SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows
CteTally(N) AS(
SELECT TOP(@Range) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
FROM E8
)
SELECT * FROM CteTally
Sie können problemlos einen weiteren CTE hinzufügen, wenn Sie mehr als 10.000 Zeilen benötigen.
Weitere Informationen zu Tally Table finden Sie in diesem hervorragenden Artikel von Jeff Moden.
Für Leistungsvergleiche zwischen Möglichkeiten zum Generieren von Tally-Tabellen lesen Sie dies .
Erklärung aus Jeffs Artikel:
Der CTE namens E1
(wie in 10E1 für die wissenschaftliche Notation) ist nichts weiter als zehn SELECT 1
wird als einzelne Ergebnismenge zurückgegeben.
E2
macht einen CROSS JOIN
von E1
mit sich. Das gibt einen einzelnen Ergebnissatz von 10*10 oder bis zu 100 Zeilen zurück. Ich sage „bis zu“, denn wenn die TOP-Funktion 100 oder weniger beträgt, sind die CTEs „intelligent“ genug, um zu wissen, dass sie eigentlich nicht weiter gehen müssen und E4
und E8
wird gar nicht ins Spiel kommen. Wenn der TOP
einen Wert von weniger als 100 hat, nicht alle 100 Zeilen, die E2
in der Lage ist, wird gemacht werden. Laut TOP
wird es immer gerade genug sein Funktion.
Von dort aus können Sie folgen. E4
ist ein CROSS JOIN
von E2
und macht bis zu 100*100 oder 10.000 Zeilen und E8
ist ein CROSS JOIN
von E4
was mehr Reihen machen wird, als die meisten Menschen jemals brauchen werden. Wenn Sie mehr getan haben, dann fügen Sie einfach ein E16
hinzu als CROSS JOIN
von E8
und ändern Sie das abschließende FROM
-Klausel zu FROM E16
.
Das wirklich Erstaunliche an diesem Bad Boy ist, dass er ZEROREADS produziert . Absolut keine, nada, nil.