Както беше коментирано по-рано, това е, защото сте достигнали броя на редовете на 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 . Абсолютно никакво, нада, нула.