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.
E2
faz umCROSS JOIN
deE1
consigo 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 eE4
eE8
nem entrará em jogo. Se oTOP
tem um valor menor que 100, nem todas as 100 linhas queE2
é capaz de fazer será feito. Ele sempre fará o suficiente de acordo com oTOP
função.
Você pode acompanhar a partir daí.E4
é umCROSS JOIN
deE2
e fará até 100*100 ou 10.000 linhas eE8
é umCROSS JOIN
deE4
que fará mais filas do que a maioria das pessoas jamais precisará. Se você fez mais, basta adicionar umE16
como umCROSS JOIN
deE8
e altere oFROM
final cláusula paraFROM E16
.
O que é realmente incrível sobre esse bad boy é que ele produz ZEROREADS . Absolutamente nenhum, nada, nada.