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

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+


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)


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)

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>;

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.