Jak již bylo uvedeno dříve, je to proto, že jste dosáhli počtu řádků sys.columns
. Zde je další způsob, jak vygenerovat seznam čísel nebo to, co ostatní nazývají Numbers Table
nebo Tally Table
.
Toto používá kaskádové CTE
s a údajně je to nejrychlejší způsob, jak vytvořit tabulku sčítání:
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
Pokud potřebujete více než 10 000 řádků, můžete snadno přidat další CTE.
Pro více informací o Tally Table si přečtěte tento skvělý článek od Jeffa Modena.
Chcete-li porovnat výkon mezi způsoby generování tabulek sčítání, přečtěte si toto .
Vysvětlení převzato z Jeffova článku:
CTE nazval
E1
(jako v 10E1 pro vědeckou notaci) není nic jiného než desetSELECT 1
's se vrátí jako jedna sada výsledků.
E2
provedeCROSS JOIN
zE1
sám se sebou. To vrátí sadu jednotlivých výsledků 10*10 nebo až 100 řádků. Říkám "až", protože pokud je funkce TOP 100 nebo méně, CTE jsou dostatečně "chytré" na to, aby věděly, že ve skutečnosti není třeba jít dále aE4
aE8
ani nevstoupí do hry. Pokud jeTOP
má hodnotu menší než 100, ne všech 100 řádků, kteréE2
je schopen vyrobit bude vyroben. Vždy to bude stačit podleTOP
funkce.Odtud můžete sledovat.
E4
jeCROSS JOIN
zE2
a vytvoří až 100*100 nebo 10 000 řádků aE8
jeCROSS JOIN
zE4
které vytvoří více řádků, než kolik lidí kdy bude potřebovat. Pokud jste udělali více, přidejteE16
jakoCROSS JOIN
zE8
a změňte finálníFROM
klauzule naFROM E16
.Na tomhle padouchovi je opravdu úžasné, že produkuje ZEROREADS . Absolutně žádný, nada, nula.