Spo*_*dgy 0 sql-server stored-procedures sql-server-2012
我的公司最近将一个 .NET 1.1/SQL Server 2000 Web 应用程序迁移到 SQL Server 2012。我们接到了几个与异常行为相关的支持电话 - 特别是没有 ORDER BY 子句的存储过程查询。
我很欣赏依赖于这些类型查询的排序的功能是不好的做法 - 但有没有人知道是否有关于 SQL Server 版本之间默认排序更改的官方 Microsoft 文档?
SQL Server 2012 不保证 SQL 2012 中返回的行的顺序。就此而言,2000 也不保证。(我为此找到的引文实际上是2005 年,但足够接近了。)
本质上,SQL Server 查询优化器保证查询树中的内部运算符将按特定顺序处理其输入。没有相应的保证该运算符的输出将暗示查询树中的下一个运算符按该顺序执行。重新排序规则可以也将会违反这个假设(并且在您,开发人员不方便时这样做;)。请理解,当我们重新排序操作以找到更有效的计划时,我们可能会导致树中中间节点的排序行为发生变化。如果您在树中放置了一个假定特定中间顺序的操作,它可能会中断。
基本上:到目前为止你很幸运,它终于咬了你。
Itzik Ben-Gan 的这篇文章可能会对您有所帮助。一个样品:
康托尔的定义暗示了集合最重要的方面之一。他没有提到集合中元素的顺序,因为顺序并不重要。这是人们在查询表时最难掌握的概念之一——也就是说,不能保证所查询的数据会按特定顺序使用。例如,有些人假设当他们查询具有聚集索引的表时,他们会以聚集索引顺序取回数据。从语言的角度来看,这并不能保证,因为您查询的是一个集合,而您返回的是一个集合。SQL Server 知道该语言不提供任何排序保证,因此它以它喜欢的任何顺序扫描数据——包括不以聚集索引顺序。人们经常使用违反基于集合和关系概念的技术,因为结果的正确性依赖于按索引顺序使用的数据,而 SQL Server 从未保证过这一点。我在我的网络独家文章中介绍了几个经典示例“Multi-Row Variable Assignment and ORDER BY ”和“ Ordered UPDATE and Set-Based Solutions to Running Aggregates ”。
Ben-Gan 编写了 SQL Server 70-461培训书,并在其中强调了这一点。
我希望我能告诉你一些更好的东西,但是......不,没有“默认顺序”,因此你不应该依赖它并且它没有记录。
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |