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ů.
E2provedeCROSS JOINzE1sá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 aE4aE8ani nevstoupí do hry. Pokud jeTOPmá hodnotu menší než 100, ne všech 100 řádků, kteréE2je schopen vyrobit bude vyroben. Vždy to bude stačit podleTOPfunkce.Odtud můžete sledovat.
E4jeCROSS JOINzE2a vytvoří až 100*100 nebo 10 000 řádků aE8jeCROSS JOINzE4které vytvoří více řádků, než kolik lidí kdy bude potřebovat. Pokud jste udělali více, přidejteE16jakoCROSS JOINzE8a změňte finálníFROMklauzule naFROM E16.Na tomhle padouchovi je opravdu úžasné, že produkuje ZEROREADS . Absolutně žádný, nada, nula.