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

Use variable with TOP in select statement in SQL Server without making it dynamic

本问题已经有最佳答案,请猛点这里访问。
1
2
3
DECLARE @top  INT
SET @top = 5
SELECT top @top * FROM tablename

可能吗?

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


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

1
SELECT top (@top) * FROM tablename


SQL Server 2005实际上允许我们使用变量,表达式或语句来参数化TOP子句。 所以你可以这样做:

1
2
3
4
5
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年及以后,你可以这样做,因为这个帖子中有几个回复。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  -- 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,那么限制仍然存在..你最终会很难找到错误:-)