根据条件在单个查询中动态获得TOP N / TOP 100 PERCENT

时间:2018-10-12 09:26:58

标签: sql tsql sql-server-2012

局部变量@V_COUNT INT。如果变量@V_COUNT'0'(零),则返回表中的所有记录,否则返回表中的{@V_COUNT}条记录的数量。例如,如果@V_COUNT = 50,则返回TOP 50条记录。如果@V_COUNT0,则返回TOP 100 PERCENT条记录。我们可以在一个查询中实现吗?

示例查询:

DECLARE @V_COUNT INT = 0

SELECT  TOP (CASE WHEN @V_COUNT > 0 THEN  @V_COUNT ELSE  100 PERCENT END) *
FROM    MY_TABLE
ORDER BY COL1
  

关键字“ percent”附近的语法不正确

5 个答案:

答案 0 :(得分:3)

更好的解决方案是根本不使用TOP-而是使用ROWCOUNT

  

SET ROWCOUNT在指定的行数后停止处理。
  ...
  要返回所有行,请将ROWCOUNT设置为0

请注意,建议ROWCOUNT仅与select语句一起使用-

  

重要
  在将来的SQL Server版本中,使用SET ROWCOUNT不会影响DELETEINSERTUPDATE语句。避免在新的开发工作中将SET ROWCOUNTDELETEINSERTUPDATE语句一起使用,并计划修改当前使用它的应用程序。对于类似的行为,请使用TOP语法。

DECLARE @V_COUNT INT = 0

SET ROWCOUNT @V_COUNT -- 0 means return all rows...

SELECT   *
FROM    MY_TABLE
ORDER BY COL1

SET ROWCOUNT 0 -- Avoid side effects...

这将不需要知道表中有多少行

请确保在查询后将ROWCOUNT重新设置为0,以避免产生副作用(Shnugo在评论中指出了要点)。

答案 1 :(得分:1)

您可以写一些非常大的数字,而不是100%,这肯定会大于查询返回的可能行数,例如。最大整数为2147483647。

答案 2 :(得分:1)

您可以执行以下操作:

DECLARE @V_COUNT INT = 0

SELECT  TOP (CASE WHEN @V_COUNT > 0 THEN  @V_COUNT ELSE (SELECT COUNT(1) FROM MY_TABLE) END) *
FROM    MY_TABLE

答案 3 :(得分:0)

DECLARE @V_COUNT int = 3
select * 
from 
  MY_TABLE 
ORDER BY 
Service_Id asc  
offset case when @V_COUNT >0 then  ((select count(*) from MY_TABLE)- @V_COUNT) else @V_COUNT end rows

答案 4 :(得分:-1)

SET ROWCOUNT迫使您进入过程逻辑。此外,您必须提供一个绝对数字。 PERCENT将需要某种计算...

您可以尝试以下方法:

DECLARE @Percent FLOAT = 50;

SELECT  TOP (SELECT CAST(CAST((SELECT COUNT(*) FROM sys.objects) AS FLOAT)/100.0 * CASE WHEN @Percent=0 THEN 100 ELSE @Percent END +1 AS INT))  o.*
FROM    sys.objects o
ORDER BY o.[name];

这看起来有点笨拙,但是计算将在微秒内完成一次...