Som tidligere nævnt er det fordi du har nået antallet af rækker af sys.columns
. Her er en anden måde at generere en liste over numre eller hvad andre kalder Numbers Table
eller Tally Table
.
Dette bruger cascaded CTE
s og siges at være den hurtigste måde at oprette en Tally Table på:
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
Du kan nemt tilføje endnu en CTE, hvis du har brug for mere end 10.000 rækker.
For mere information om Tally Table, læs denne fremragende artikel af Jeff Moden.
Læs dette for at få præstationssammenligninger mellem måder at generere Tally-tabeller på .
Forklaring taget fra Jeffs artikel:
CTE kaldet E1
(som i 10E1 for videnskabelig notation) er intet mere end ti SELECT 1
's returneres som et enkelt resultatsæt.
E2
laver en CROSS JOIN
af E1
med sig selv. Det returnerer et enkeltresultatsæt på 10*10 eller op til 100 rækker. Jeg siger "op til", fordi hvis TOP-funktionen er 100 eller mindre, er CTE'erne "smarte" nok til at vide, at de faktisk ikke behøver at gå længere og E4
og E8
vil ikke engang komme i spil. Hvis TOP
har en værdi på mindre end 100, ikke alle 100 rækker, der E2
er i stand til at lave vil blive lavet. Det vil altid give lige nok i henhold til TOP
funktion.
Du kan følge med derfra. E4
er en CROSS JOIN
af E2
og vil udgøre op til 100*100 eller 10.000 rækker og E8
er en CROSS JOIN
af E4
hvilket vil lave flere rækker, end de fleste nogensinde har brug for. Hvis du har gjort mere, skal du blot tilføje en E16
som en CROSS JOIN
af E8
og ændre den endelige FROM
klausul til FROM E16
.
Det, der virkelig er fantastisk ved denne dårlige dreng, er, at den producerer ZEROREADS . Absolut ingen, nada, nul.