Както беше коментирано по-рано, това е, защото сте достигнали броя на редовете на sys.columns . Ето друг начин за генериране на списък с числа или това, което другите наричат Numbers Table или Tally Table .
Това използва каскаден CTE s и се казва, че е най-бързият начин за създаване на таблица за изчисление:
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
Можете лесно да добавите друг CTE, ако имате нужда от повече от 10 000 реда.
За повече информация относно Tally Table, прочетете тази отлична статия от Джеф Модън.
За сравнения на производителността между начините за генериране на таблици за изчисление, прочетете това .
Обяснение взето от статията на Джеф:
CTE, наречен
E1(както в 10E1 за научна нотация) не е нищо повече от десетSELECT 1's се връща като единичен набор от резултати.
E2правиCROSS JOINнаE1със себе си. Това връща набор от единичен резултат от 10*10 или до 100 реда. Казвам "до", защото ако функцията TOP е 100 или по-малко, CTE са достатъчно "интелигентни", за да знаят, че всъщност не е нужно да отиват по-нататък иE4иE8дори няма да влезе в игра. АкоTOPима стойност по-малка от 100, не всички 100 реда, коитоE2е в състояние да направи ще бъде направено. Винаги ще прави достатъчно споредTOPфункция.Можете да следвате от там.
E4еCROSS JOINнаE2и ще направи до 100*100 или 10 000 реда иE8еCROSS JOINнаE4което ще направи повече редове, отколкото повечето хора някога ще имат нужда. Ако сте направили повече, просто добаветеE16катоCROSS JOINнаE8и променете крайнияFROMклауза къмFROM E16.Това, което е наистина невероятно в това лошо момче, е, че произвежда ZEROREADS . Абсолютно никакво, нада, нула.