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

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+


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)


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)

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.