65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL Select Top 100 % 忽略 Order By 子句

2008年3月19日

CPOL

1分钟阅读

viewsIcon

29804

SQL 2005+ 改变了 order by 相对于 Select top 100% 的行为。

引言

有时,开发者无法相信自己的眼睛,当事情在没有警告的情况下发生变化时。他们只是以另一种方式做出反应,而没有人知道为什么。

我们谈论的是什么?

在 Select 查询(在视图、内联函数或类似内容中)中使用 Order By 是初学者级别的语句。它没有什么挑战性……但在某些情况下,SQL Server 只是忽略了 Order By 子句。让我们看一个常见的 SQL 语句

Select * from Customer Order By CompanyName, City

现在,段代码运行正常。在某些情况下,我们添加了一个 Top 100% 子句

Select Top 100% from Customer Order By CompanyName, City

如果我们运行段或多或少相同的查询,我们会看到,行现在是无序的……

解决方案

经过几个小时的研究,我们在 SQL Server Books Online 中找到了以下章节

当在视图、内联函数、派生表或子查询的定义中使用 ORDER BY 时,该子句仅用于确定 TOP 子句返回的行。除非在查询本身中也指定了 ORDER BY,否则 ORDER BY 子句不能保证这些结构查询的排序结果。

但是,出于某种原因,它在使用数字 Top 时有效

Select Top 10 from Customer Order By CompanyName, City

这段代码有效……所以我们的解决方案……我们取 Top 子句的最高可能值(这意味着 max(int) = 2147483647,并且它有效……)

Select Top 2147483647 from Customer Order By CompanyName, City

这将给我们我们期望的结果。现在你只需要更改所有的 Top 100% 即可,对于 2005 及更高版本的 SQL Server 发布版本,你就可以高枕无忧了。

© . All rights reserved.