web-dev-qa-db-fra.com

Utiliser une variable avec TOP dans une instruction select dans SQL Server sans la rendre dynamique

declare @top  int
set @top = 5
select top @top * from tablename

C'est possible?

Ou une idée pour une telle logique (je ne veux pas utiliser la requête dynamique)?

200
Paresh

Oui, dans SQL Server 2005, il est possible d’utiliser une variable dans la clause top.

select top (@top) * from tablename
370
Guffa

SQL Server 2005 nous permet en réalité de paramétrer la clause TOP à l'aide d'une variable, d'une expression ou d'une instruction. Pour que vous puissiez faire des choses comme:

SELECT TOP (@foo) a FROM table ORDER BY a 

SELECT TOP (SELECT COUNT(*) FROM somewhere else) a FROM table ORDER BY a 

SELECT TOP (@foo + 5 * 4 / 2) a FROM table ORDER BY a 

Source

38
Espo

En 2005 et après, vous pouvez le faire car ce fil contient plusieurs réponses.

Ce qui est moins connu, c'est que vous pouvez y parvenir également en 2k, en utilisant SET ROWCOUNT.

  -- Works in all versions
  SELECT TOP 10

  -- Does not work on 2000
  SELECT TOP (10)
  SELECT TOP (@rows)

  -- Works in both 2ooo and 2oo5
  SET ROWCOUNT @max

  SELECT * 
  FROM ...

  SET ROWCOUNT 0

Notez que si vous oubliez SET ROWCOUNT 0 à la fin, la limite persiste .. et vous aurez très difficile de localiser les bogues :-)

24
Brimstedt