Этот вопрос уже имеет ответ здесь:
declare @top int
set @top = 5
select top @top * from tablename
Действительно ли это возможно?
Или какая-либо идея для такой логики (я не хочу использовать динамический запрос)?
Да, в SQL Server 2005 можно использовать переменную в предложении top
.
select top (@top) * from tablename
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
В 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 в конце, ограничение останется ... и вам будет очень трудно найти ошибки: -)