我可以在SELECT TOP中使用一个值来返回所有行吗?


13

我允许最终用户定义查询返回的行数(SELECT TOP(@x))。是否可以在返回所有行的地方输入一个值?还是如果他们想返回所有行,是否必须动态创建不具有TOP(@x)的查询?

我正在使用SQL Server 2012。


它是TOP ... ORDER BY什么?是ORDER BY什么仍然需要的情况下,你选择呢?
马丁·史密斯

1
我想呃...只是省略了不可能TOP吗?就像您要处理一些预定义查询一样,您必须传递一些内容吗?
corsiKa

Answers:


17

好吧,如果您不使用PERCENT,则看起来TOPBIGINT。这意味着您可以传入BIGINT的最大值,

SELECT TOP (9223372036854775807) * FROM table1

我严重怀疑您会看到这么大的桌子。我不确定这会对查询计划产生什么样的影响。


7
假设变量@x是一个BIGINT,那么SET @x = 0x7fffffffffffffff可能会更清楚一些。无论如何,更容易记住。
马丁·史密斯

@MartinSmith,老实说,我将以任何一种方式进行查找:)我之前从未见过这样做。那是隐式转换吗?
肯尼斯·费舍尔

7
好吧,如果您只是想开始,7然后记住其余部分,则很容易记住F,而8个字节总共需要16个字符。是的,如果分配给该数据类型的变量,它将被隐式转换。
马丁·史密斯

@MartinSmith依靠值的二进制表示是一种好习惯吗?该文件规定值的二进制表示可能会从版本更改为SQL Server的版本。另外,我不知道我是否是唯一的人,总是0x7fffffffffffffffbigintSqlServer中max 的表示感到困惑。其原因是,在SqlServer中的二进制常量符号必须7f最低字节,其中作为语言,如C ++你拥有了它的最高字节,获得最大符号整型。
i-one

3
@ i-one。整数类型的二进制表示形式极不可能更改。如果不期望我们可以依赖特定格式,则SQL Server提供针对整数类型进行操作的按位运算符将毫无意义。
马丁·史密斯

12

您也可以考虑

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

代替

SELECT TOP (@x) Foo
FROM Bar 
ORDER BY Baz;

您需要将@x设置为的值是0禁用它。

对于数据修改语句,不建议使用此方法,但对于,则不建议使用SELECT

在2012年,针对ROWCOUNT0与一些非零值的情况,编制了另一个计划。

如果ORDER BY Baz仅在其中提供了含义,TOP而不是提供结果的显示顺序,并且您没有索引支持该结果,则将其分为两个查询可以避免不必要的排序0


8

SELECT TOP 100 PERCENT可用于在查询中使用“ TOP”来绕过任何错误。


1
对我来说,这并不能真正解释使用经过优化的功能的原因。Crystal Reports是否期望视图定义中包含ORDER BY?
Andriy M

不,Crystal Reports在处理查询和对查询强制执行自己的执行计划方面存在问题,这使它们效率很低,有时甚至不准确。我更喜欢在SQL查询中完成所有逻辑和设计,并在Crystal中使其简单“漂亮”。这就是为什么我大部分都已迁移到SSIS / SSRS的原因,但那里仍然有旧版报告。
MguerraTorres

-2
select top(SELECT COUNT(*) FROM YourTable) * From YourTable

1
问题在于参数化 TOP子句。OP在@x那儿已经有一个参数(),并且他们现在正在询问要传递给什么值,@x以便无论表实际有多少行,它都意味着“所有行”。也许您可以弄清楚如何调整您的解决方案以满足OP的要求。
Andriy M

1
我已经进行了调整以适合该问题,尽管按照本文所述,如果同时插入行,则存在竞争条件。在此期间,需要使用表锁来解决阻止并发插入的问题。只需使用大量的数字,就可以避免这种检查以及额外的检查费用。
马丁·史密斯

(SELECT COUNT(*) FROM YourTable)不是一个值。
ypercubeᵀᴹ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.