Zoals eerder opgemerkt, is dit omdat je het aantal rijen van sys.columns
hebt bereikt . Hier is een andere manier om een lijst met nummers te genereren of wat anderen Numbers Table
noemen of Tally Table
.
Dit maakt gebruik van trapsgewijze CTE
s en zou de snelste manier zijn om een Tally Table te maken:
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
U kunt gemakkelijk nog een CTE toevoegen als u meer dan 10.000 rijen nodig heeft.
Lees voor meer informatie over Tally Table dit uitstekende artikel door Jeff Moden.
Lees dit . voor prestatievergelijkingen tussen manieren om tallytabellen te genereren .
Uitleg uit Jeff's artikel:
De CTE genaamd E1
(zoals in 10E1 voor wetenschappelijke notatie) is niets meer dan tien SELECT 1
wordt geretourneerd als een enkele resultaatset.
E2
doet een CROSS JOIN
van E1
met zichzelf. Dat retourneert een set met één resultaat van 10*10 of maximaal 100 rijen. Ik zeg "tot" want als deTOP-functie 100 of minder is, zijn de CTE's "slim" genoeg om te weten dat het eigenlijk niet verder hoeft te gaan en E4
en E8
komt niet eens in het spel. Als de TOP
heeft een waarde van minder dan 100, niet alle 100 rijen die E2
kan maken zal worden gemaakt. Het zal altijd net genoeg maken volgens de TOP
functie.
Van daaruit kun je volgen. E4
is een CROSS JOIN
van E2
en zal tot 100*100 of 10.000 rijen maken en E8
is een CROSS JOIN
van E4
die meer rijen zal maken dan de meeste mensen ooit nodig zullen hebben. Als je meer gedaan hebt, voeg dan gewoon een E16
toe als een CROSS JOIN
van E8
en verander de laatste FROM
clausule naar FROM E16
.
Wat echt geweldig is aan deze slechterik, is dat hij ZEROREADS . produceert . Absoluut geen, nada, nul.