sql >> Base de Datos >  >> RDS >> Sqlserver

Seleccionando N filas en SQL Server

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.