declare @t int
set @t = 10
if (o = 'mmm') set @t = -1
select top(@t) * from table
Run Code Online (Sandbox Code Playgroud)
如果我一般想要10行,但很少全部.
我知道我可以通过"SET ROWCOUNT"来做到这一点.但是有一些变量数,比如-1,导致TOP产生所有元素.
Mar*_*ith 31
可以传递给的最大可能值TOP
就是9223372036854775807
你可以传递它.
下面我使用max signed bigint的二进制形式,因为只要你知道基本模式并且bigint是8个字节就更容易记住.
declare @t bigint = case when some_condition then 10 else 0x7fffffffffffffff end;
select top(@t) *
From table
Run Code Online (Sandbox Code Playgroud)
如果你没有order by子句,那么前10名将只是10和依赖于优化.
如果你确实有一个order by子句来定义前10个和一个支持它的索引,那么上面查询的计划应该适用于任何可能的值.
如果您没有支持索引并且计划显示排序,则应考虑拆分为两个查询.
我不确定我理解你的问题.
但是如果你有时想要TOP而其他时候不要只使用if/else构造:
if (condition)
'send TOP
SELECT TOP 10 Blah FROM...
else
SELECT blah1, blah2 FROM...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19974 次 |
最近记录: |