Jak skomentowano wcześniej, dzieje się tak, ponieważ osiągnąłeś liczbę wierszy sys.columns
. Oto inny sposób generowania listy liczb lub tego, co inni nazywają Numbers Table
lub Tally Table
.
Używa kaskadowego CTE
s i mówi się, że jest to najszybszy sposób na utworzenie tabeli Tally:
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
Możesz łatwo dodać kolejne CTE, jeśli potrzebujesz więcej niż 10 000 wierszy.
Aby uzyskać więcej informacji o tabeli Tally, przeczytaj ten doskonały artykuł autorstwa Jeffa Modena.
Aby porównać wydajność między sposobami generowania tabel z danymi, przeczytaj to .
Wyjaśnienie zaczerpnięte z artykułu Jeffa:
CTE o nazwie E1
(jak w 10E1 dla notacji naukowej) to nic więcej niż dziesięć SELECT 1
jest zwracany jako pojedynczy zestaw wyników.
E2
wykonuje CROSS JOIN
z E1
z samym sobą. To zwraca pojedynczy zestaw wyników składający się z 10*10 lub do 100 wierszy. Mówię „do”, ponieważ jeśli funkcja TOP wynosi 100 lub mniej, CTE są wystarczająco „inteligentne”, aby wiedzieć, że nie trzeba iść dalej i E4
i E8
nawet nie wejdzie w grę. Jeśli TOP
ma wartość mniejszą niż 100, a nie wszystkie 100 wierszy, które E2
jest w stanie sprawić, że zostanie wykonana. Zawsze wystarczy, zgodnie z TOP
funkcja.
Możesz śledzić stamtąd. E4
to CROSS JOIN
z E2
i zrobi do 100*100 lub 10 000 wierszy i E8
to CROSS JOIN
z E4
co spowoduje więcej rzędów, niż większość ludzi kiedykolwiek będzie potrzebować. Jeśli zrobiłeś więcej, po prostu dodaj E16
jako CROSS JOIN
z E8
i zmień końcowy FROM
klauzula do FROM E16
.
To, co jest naprawdę niesamowite w tym złym chłopcu, to to, że produkuje ZEROREADY . Absolutnie żaden, nada, zero.