在 SQLServer 的 select 语句中使用带 TOP 的变量,而不使其成为动态的

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

有可能吗?

或者对这样的逻辑有什么想法(我不想使用动态查询) ?

110312 次浏览

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

Source .

是的,在SQL Server 2005中,可以在top子句中使用变量。

select top (@top) * from tablename

在2005年以后,你可以这样做,因为在这个线程中有几个回复。

鲜为人知的是,你也可以通过SET ROWCOUNT在2k中实现这一点。

  -- 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,限制仍然存在。你最终会发现很难找到bug:-)