Dynamic SELECT TOP @var dans SQL Server

308

Comment puis-je avoir une variable dynamique définissant la quantité de lignes à retourner dans SQL Server? La syntaxe ci-dessous n'est pas valide dans SQL Server 2005+:

DECLARE @count int
SET @count = 20

SELECT TOP @count * FROM SomeTable
eddiegroves
la source
2
Utilisez-vous SQL 2005 ou 2008?
Brian Kim
Exécution de SQL Server 2005 actuellement
eddiegroves

Réponses:

561
SELECT TOP (@count) * FROM SomeTable

Cela ne fonctionnera qu'avec SQL 2005+

Brian Kim
la source
52
J'oublie toujours les parenthèses aussi.
John Sheehan
14
c'est bien! Pendant tout ce temps, j'ai pensé que je devais utiliser SQL dynamique.
Laguna
1
Qui d'autre est ici pour réaliser l'erreur idiote dans leur requête en n'ajoutant pas les parenthèses?
Raghav
Tu m'as sauvé la journée! J'ai pensé déplacer tout en requête dynamique uniquement pour cela!
Altaf Patel
41

La syntaxe "select top (@var) ..." ne fonctionne que dans SQL SERVER 2005+. Pour SQL 2000, vous pouvez faire:

set rowcount @top

select * from sometable

set rowcount 0 

J'espère que cela t'aides

Oisin.

(modifié pour remplacer @@ rowcount par rowcount - merci augustlights)

x0n
la source
1
J'ai entendu dire qu'il est possible d'obtenir un numéro de ligne incorrect avec @@ RowCount si vous avez une clé primaire à plusieurs colonnes. Est-ce vrai?
Brian Kim
4

Il est également possible d'utiliser du SQL dynamique et de l'exécuter avec la commande 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
la source
8
Mais méfiez-vous (très) des attaques par injection SQL avec cette approche
MadSkunk
4

Ou vous mettez simplement la variable entre parenthèses

DECLARE @top INT = 10;

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