Dynamic SELECT TOP @var in SQL Server


308

Come posso avere una variabile dinamica che imposta la quantità di righe da restituire in SQL Server? Di seguito non è presente la sintassi valida in SQL Server 2005+:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable

2
Stai eseguendo SQL 2005 o 2008?
Brian Kim,

Esecuzione di SQL Server 2005 attualmente
eddiegroves

Risposte:


561
SELECT TOP (@count) * FROM SomeTable

Funzionerà solo con SQL 2005+


52
Dimentico sempre anche le parentesi.
John Sheehan,

14
è fantastico! per tutto questo tempo ho pensato di dover usare sql dinamico.
Laguna,

1
Chi altro è qui per rendersi conto dell'errore sciocco nella loro domanda non aggiungendo le parentesi?
Raghav,

Mi hai salvato la giornata! Ho pensato di passare tutto alla query dinamica solo per questo!
Altaf Patel,

41

La sintassi "select top (@var) ..." funziona solo in SQL SERVER 2005+. Per SQL 2000, puoi fare:

set rowcount @top

select * from sometable

set rowcount 0 

Spero che questo ti aiuti

Oisin.

(modificato per sostituire @@ rowcount con rowcount - grazie augustlights)


1
Ho sentito che è possibile ottenere un numero di riga errato con @@ RowCount se si dispone della chiave primaria a più colonne. È vero?
Brian Kim,


4

È anche possibile utilizzare SQL dinamico ed eseguirlo con il 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
Ma
stai

4

Oppure inserisci semplicemente la variabile tra parentesi

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.