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.
E2gör enCROSS JOINavE1med 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 ochE4ochE8kommer inte ens att spela in. OmTOPhar 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 enligtTOPfunktion.Du kan följa därifrån.
E4är enCROSS JOINavE2och kommer att göra upp till 100*100 eller 10 000 rader ochE8är enCROSS JOINavE4vilket kommer att skapa fler rader än de flesta någonsin kommer att behöva. Om du har gjort mer, lägg bara till enE16som enCROSS JOINavE8och ändra den sistaFROMklausul tillFROM E16.Det som verkligen är fantastiskt med den här badboyen är att den producerar ZEROREADS . Absolut ingen, nada, noll.