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

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+


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)


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)

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.