2008-10-06 7 views
236

Comment puis-je avoir une variable dynamique définissant la quantité de lignes à retourner dans SQL Server? Voici pas la syntaxe valide dans SQL Server 2005+:Dynamic SELECT TOP @var Dans SQL Server

DECLARE @count int 
SET @count = 20 

SELECT TOP @count * FROM SomeTable 
+2

Êtes-vous en cours d'exécution SQL 2005 ou 2008? –

+0

Exécution de SQL Server 2005 actuellement – eddiegroves

+1

Bonne question. Merci. –

Répondre

425
SELECT TOP (@count) * FROM SomeTable 

Cela ne fonctionne qu'avec SQL 2005+

+37

J'oublie toujours les parenthèses aussi. –

+10

c'est génial! Pendant tout ce temps, j'ai pensé que je devais utiliser SQL dynamique. – Laguna

36

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 

Hope this helps

Oisin.

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

+0

J'ai entendu dire qu'il est possible d'obtenir un numéro de ligne incorrect avec @@ RowCount si vous avez une clé primaire multi-colonnes. Est-ce vrai? –

3

Il est aussi possible d'utiliser SQL dynamique et 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) 
+2

Mais soyez (très) méfiants des [attaques par injection SQL] (https://en.wikipedia.org/wiki/SQL_injection) avec cette approche – MadSkunk

1

Ou yo u vient de mettre la variable entre parenthèses

DECLARE @top INT = 10; 

SELECT TOP (@Top) * 
FROM <table_name>; 
0
declare @rows int = 10 

select top (@rows) * 
from Employees 
order by 1 desc -- optional to get the last records using the fist column of the table 
Questions connexes