Como comentado anteriormente, é porque você atingiu o número de linhas de
sys.columns . Aqui está outra maneira de gerar uma lista de números ou o que os outros chamam de Numbers Table ou Tally Table . Isso usa
CTE em cascata s e é considerado a maneira mais rápida de criar uma Tabela de 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
Você pode facilmente adicionar outro CTE se precisar de mais de 10.000 linhas.
Para obter mais informações sobre o Tally Table, leia este excelente artigo por Jeff Moden.
Para comparações de desempenho entre as formas de gerar Tabelas de Tally, leia este .
Explicação retirada do artigo de Jeff:
O CTE chamadoE1(como em 10E1 para notação científica) não é nada mais que dezSELECT 1é retornado como um único conjunto de resultados.
E2faz umCROSS JOINdeE1consigo mesmo. Isso retorna um único conjunto de resultados de 10*10 ou até 100 linhas. Eu digo "até" porque se a função TOP for 100 ou menos, os CTEs são "inteligentes" o suficiente para saber que não precisa ir mais longe eE4eE8nem entrará em jogo. Se oTOPtem um valor menor que 100, nem todas as 100 linhas queE2é capaz de fazer será feito. Ele sempre fará o suficiente de acordo com oTOPfunção.
Você pode acompanhar a partir daí.E4é umCROSS JOINdeE2e fará até 100*100 ou 10.000 linhas eE8é umCROSS JOINdeE4que fará mais filas do que a maioria das pessoas jamais precisará. Se você fez mais, basta adicionar umE16como umCROSS JOINdeE8e altere oFROMfinal cláusula paraFROM E16.
O que é realmente incrível sobre esse bad boy é que ele produz ZEROREADS . Absolutamente nenhum, nada, nada.