Использовать переменную с TOP в инструкции select в SQL Server, не делая ее динамичной

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

Возможно ли это?

Или любая идея для такой логики (я не хочу использовать динамический запрос)?

Ответ 1

Да, в SQL Server 2005 можно использовать переменную в предложении top.

select top (@top) * from tablename

Ответ 2

SQL Server 2005 фактически позволяет нам параметризовать предложение TOP, используя переменную, выражение или оператор. Таким образом, вы можете делать такие вещи, как:

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 

Источник

Ответ 3

В 2005 году и позже вы можете сделать это, так как в этом потоке есть несколько ответов.

Чем менее известно, что вы можете достичь этого также в 2k, используя 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

Обратите внимание, что если вы забыли SET ROWCOUNT 0 в конце, предел сохранится.. и вам будет очень сложно найти ошибки: -)