在SQL Server的select语句中使用带有TOP的变量而不使其动态化

Par*_*esh 205 sql t-sql sql-server sql-server-2005

declare @top  int
set @top = 5
select top @top * from tablename
Run Code Online (Sandbox Code Playgroud)

可能吗?

或任何想法这样的逻辑(我不想使用动态查询)?

Guf*_*ffa 381

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

select top (@top) * from tablename
Run Code Online (Sandbox Code Playgroud)

  • 是什么让它变得更加奇怪......括号是必不可少的!如果没有"@top"左右的括号,您将得到不正确的语法.谢谢! (4认同)

Esp*_*spo 38

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 
Run Code Online (Sandbox Code Playgroud)

资源


Bri*_*edt 25

在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
Run Code Online (Sandbox Code Playgroud)

注意,如果你最后忘记了SET ROWCOUNT 0,那么限制仍然存在..你最终会很难找到错误:-)

  • 另请注意,SET ROWCOUNT不会影响执行计划,因此在SQL 2005中首选使用TOP. (4认同)
  • 关于`SET ROWCOUNT`的讨论+1.这不是我使用的解决方案,但我喜欢你提出的解决方案 (2认同)