Som kommenterat tidigare beror det på att du nådde antalet rader i sys.columns
. Här är ett annat sätt att skapa en lista med nummer eller vad andra kallar Numbers Table
eller Tally Table
.
Detta använder kaskadad CTE
s och sägs vara det snabbaste sättet att skapa en Tally-tabell:
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 enkelt lägga till ytterligare en CTE om du behöver fler än 10 000 rader.
För mer information om Tally Table, läs denna utmärkta artikel av Jeff Moden.
Läs det här för prestandajämförelser mellan olika sätt att generera Tally-tabeller .
Förklaring hämtad från Jeffs artikel:
CTE kallas
E1
(som i 10E1 för vetenskaplig notation) är inget mer än tioSELECT 1
's returneras som en enda resultatuppsättning.
E2
gör enCROSS JOIN
avE1
med sig själv. Det returnerar en enstaka resultatuppsättning på 10*10 eller upp till 100 rader. Jag säger "upp till" för om TOP-funktionen är 100 eller mindre är CTE:erna tillräckligt "smarta" för att veta att de faktiskt inte behöver gå längre ochE4
ochE8
kommer inte ens att spela in. OmTOP
har ett värde på mindre än 100, inte alla 100 rader somE2
är kapabel att göra kommer att göras. Det kommer alltid att tjäna precis tillräckligt enligtTOP
funktion.Du kan följa därifrån.
E4
är enCROSS JOIN
avE2
och kommer att göra upp till 100*100 eller 10 000 rader ochE8
är enCROSS JOIN
avE4
vilket kommer att skapa fler rader än de flesta någonsin kommer att behöva. Om du har gjort mer, lägg bara till enE16
som enCROSS JOIN
avE8
och ändra den sistaFROM
klausul tillFROM E16
.Det som verkligen är fantastiskt med den här badboyen är att den producerar ZEROREADS . Absolut ingen, nada, noll.