Использовать переменную с 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
В 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 в конце, предел сохранится.. и вам будет очень сложно найти ошибки: -)