局部变量@V_COUNT
INT
。如果变量@V_COUNT
为'0'
(零),则返回表中的所有记录,否则返回表中的{@V_COUNT}
条记录的数量。例如,如果@V_COUNT = 50
,则返回TOP 50
条记录。如果@V_COUNT
是0
,则返回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”附近的语法不正确
答案 0 :(得分:3)
更好的解决方案是根本不使用TOP
-而是使用ROWCOUNT
:
SET ROWCOUNT
在指定的行数后停止处理。
...
要返回所有行,请将ROWCOUNT
设置为0
。
请注意,建议ROWCOUNT
仅与select
语句一起使用-
重要
在将来的SQL Server版本中,使用SET ROWCOUNT
不会影响DELETE
,INSERT
和UPDATE
语句。避免在新的开发工作中将SET ROWCOUNT
与DELETE
,INSERT
和UPDATE
语句一起使用,并计划修改当前使用它的应用程序。对于类似的行为,请使用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];
这看起来有点笨拙,但是计算将在微秒内完成一次...