Dynamic SELECT TOP @var No SQL Server

308

Como posso ter uma variável dinâmica definindo a quantidade de linhas a retornar no SQL Server? Abaixo não há sintaxe válida no SQL Server 2005+:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable
eddiegroves
fonte
2
Você está executando o SQL 2005 ou 2008?
Brian Kim
Atualmente executando o SQL Server 2005
eddiegroves 6/08

Respostas:

561
SELECT TOP (@count) * FROM SomeTable

Isso funcionará apenas com o SQL 2005+

Brian Kim
fonte
52
Também sempre esqueço os parênteses.
John Sheehan
14
isso é ótimo! todo esse tempo eu pensei que tinha que usar sql dinâmico.
Laguna
1
Quem mais está aqui para perceber o erro bobo em sua consulta não adicionando parênteses?
Raghav
Você salvou o meu dia! Eu pensei em mover todos para consulta dinâmica apenas para isso!
Altaf Patel 23/01
41

A sintaxe "selecione superior (@var) ..." funciona apenas no SQL SERVER 2005+. Para o SQL 2000, você pode fazer:

set rowcount @top

select * from sometable

set rowcount 0 

Espero que isto ajude

Oisin.

(editado para substituir @@ rowcount por rowcount - obrigado augustlights)

x0n
fonte
1
Ouvi dizer que é possível obter um número de linha incorreto com @@ RowCount se você tiver uma chave primária de várias colunas. Isso é verdade?
Brian Kim
4

Também é possível usar SQL dinâmico e executá-lo com o 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)
Jan
fonte
8
Mas ser (muito) Desconfie de ataques de injeção SQL com esta abordagem
MadSkunk
4

Ou você apenas coloca a variável entre parênteses

DECLARE @top INT = 10;

SELECT TOP (@Top) *
FROM <table_name>;
ShawnThompson
fonte
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
fonte