【问题标题】:Is there way to have ordered output without ORDER BY clause in MS SQL有没有办法在 MS SQL 中没有 ORDER BY 子句的有序输出
【发布时间】:2020-06-05 13:06:56
【问题描述】:

我们有一个大型应用程序。最近,我们升级了数据库 MS SQL 2016。因此,我们在一些报告中遇到了输出顺序问题。不幸的是,我们无法更改应用程序的源代码,并且暂时无法这样做。这种行为的原因是某些格式为“SELECT * FROM table”的查询没有“ORDER BY”子句。

有没有创造性的方式来排序输出?喜欢在 SELECT 上添加触发器?还有什么办法吗?任何类型的索引都会成为 ORDER 默认值?

更新:我无法更改源代码。这是已编译的应用程序,升级周期还有几个月。如果可以的话,我会浏览源代码并更改这些查询。

【问题讨论】:

  • 我不认为您可以将其他查询变成子查询? SELECT t.* FROM (unchangeable application query here) as t ORDER BY t.column
  • 按顺序使用视图,并让您的报告选择这些视图。
  • @MarcGuillot - 视图也是无序的。不幸的是,即使是 SSMS 也会出错并生成代码,让您看起来可以订购视图。有时它看起来很有效,但决不能保证保持一致。
  • 好吧,你永远不应该依赖没有 explixit order by 的结果集的“顺序”。让我想起了视图中使用的 select top 100 percent 以便能够添加 order by,当 SQL Server 优化它的客户抱怨 我们的应用程序损坏 :-)
  • 如果您不在数据库中订购,则需要在应用程序中订购。这就是 SQL 的规律。

标签: sql sql-server sql-order-by sql-server-2014


【解决方案1】:

你问:

有没有办法在 MS SQL 中没有 ORDER BY 子句来排序输出

没有。

很遗憾,没有。

SQL(在所有形式中)是一种用于操作表行集的声明性方案。像行这样的集合没有内在的顺序。

如果没有ORDER BY 语句的任何形式的SQL 碰巧以您期望的顺序传递行,那是巧合。这纯粹是运气。正式地说,如果没有ORDER BY,SQL 会以不可预测的顺序传递行。“不可预测”就像“随机”,但更糟。 随机 意味着您每次运行查询时可能会得到不同的顺序:您可以在系统测试中捕获这种东西。 不可预知意味着你每次都得到相同的订单,直到你没有。现在你不知道了。

这是 SQL 的基本性质。为什么?现代数据库服务器中的优化器非常聪明,可以尽可能快地准确交付您所要求的内容,并且每个版本都变得更加智能。 SQL Server 2016 的优化器可能注意到了一些在查询中使用并发的机会,或者类似的东西,并抓住了它们。

你在这里的选择都是不愉快的:

  • 回滚数据库升级。 可能可能不会解决问题。
  • 对您的软件负载进行紧急修复并提前推出。
  • 在修复您的软件之前,请忍受顺序错误的报告。

我在这里写了一个很长的答案,这样您就可以就您的情况向您的公司霸主提出有用的论据。当你解释这一点时,我不羡慕你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多