Dynamic SELECT TOP @var en SQL Server

308

¿Cómo puedo tener una variable dinámica que establezca la cantidad de filas para devolver en SQL Server? A continuación no se encuentra la sintaxis válida en SQL Server 2005+:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable
Eddiegroves
fuente
2
¿Estás ejecutando SQL 2005 o 2008?
Brian Kim
Ejecutando SQL Server 2005 actualmente
eddiegroves

Respuestas:

561
SELECT TOP (@count) * FROM SomeTable

Esto solo funcionará con SQL 2005+

Brian Kim
fuente
52
Siempre olvido los paréntesis también.
John Sheehan
14
¡esto es genial! todo este tiempo pensé que tenía que usar sql dinámico.
Laguna
1
¿Quién más está aquí para darse cuenta del error tonto en su consulta al no agregar los paréntesis?
Raghav
¡Salvaste mi día! ¡Pensé mover todo a la consulta dinámica solo para esto!
Altaf Patel
41

La sintaxis "select top (@var) ..." solo funciona en SQL SERVER 2005+. Para SQL 2000, puede hacer:

set rowcount @top

select * from sometable

set rowcount 0 

Espero que esto ayude

Oisin

(editado para reemplazar @@ rowcount con rowcount - gracias augustlights)

x0n
fuente
1
Escuché que es posible obtener un número de fila incorrecto con @@ RowCount si tiene una clave primaria de varias columnas. ¿Es eso cierto?
Brian Kim
4

También es posible usar SQL dinámico y ejecutarlo con el comando exec:

declare @sql  nvarchar(200), @count int
set @count = 10
set @sql = N'select top ' + cast(@count as nvarchar(4)) + ' * from table'
exec (@sql)
ene
fuente
8
Pero tenga cuidado con los ataques de inyección SQL con este enfoque
MadSkunk
4

O simplemente pones la variable entre paréntesis

DECLARE @top INT = 10;

SELECT TOP (@Top) *
FROM <table_name>;
ShawnThompson
fuente
4
declare @rows int = 10

select top (@rows) *
from Employees
order by 1 desc -- optional to get the last records using the first column of the table
David Castro
fuente