Como se comentó anteriormente, es porque alcanzó el número de filas de sys.columns
. Aquí hay otra forma de generar una lista de números o lo que otros llaman Numbers Table
o Tally Table
.
Esto usa CTE
en cascada s y se dice que es la forma más rápida de crear una tabla de conteo:
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
Puede agregar fácilmente otro CTE si necesita más de 10 000 filas.
Para obtener más información sobre Tally Table, lea este excelente artículo por Jeff Moden.
Para obtener comparaciones de rendimiento entre las formas de generar tablas de conteo, lea esto. .
Explicación tomada del artículo de Jeff:
El CTE llamado E1
(como en 10E1 para notación científica) no es más que diez SELECT 1
se devuelve como un único conjunto de resultados.
E2
hace un CROSS JOIN
de E1
consigo mismo Eso devuelve un conjunto de resultados único de 10*10 o hasta 100 filas. Digo "hasta" porque si la función TOP es 100 o menos, los CTE son lo suficientemente "inteligentes" para saber que en realidad no necesita ir más lejos y E4
y E8
ni siquiera entrará en juego. Si el TOP
tiene un valor de menos de 100, no todas las 100 filas que E2
es capaz de hacer será hecho. Siempre producirá lo suficiente según el TOP
función.
Puedes seguir desde allí. E4
es un CROSS JOIN
de E2
y hará hasta 100*100 o 10.000 filas y E8
es un CROSS JOIN
de E4
lo que hará más filas de las que la mayoría de la gente necesitará. Si hizo más, simplemente agregue un E16
como CROSS JOIN
de E8
y cambiar el FROM
final cláusula a FROM E16
.
Lo realmente sorprendente de este chico malo es que produce ZEROREADS . Absolutamente nada, nada, nada.