有没有办法在 MS SQL 中不使用 ORDER BY 子句来排序输出
Is there way to have ordered output without ORDER BY clause in MS SQL
我们有一个大型应用程序。最近,我们升级了数据库 MS SQL 2016。因此,我们在某些报告中遇到输出顺序问题。不幸的是,我们无法更改应用程序的源代码,并且暂时无法这样做。这种行为的原因是某些格式为 "SELECT * FROM table" 的查询没有 "ORDER BY" 子句。
有没有什么创造性的方法来排序输出?想在 SELECT<(我知道没有这样的东西...)> 上添加触发器?还有别的办法吗?任何类型的索引都会成为 ORDER 默认值?
更新:我无法更改源代码。这是已编译的应用程序,升级周期还有几个月。如果可以的话,我会直接查看源代码并更改这些查询。
您问的是:
Is there a way to have ordered output without an ORDER BY clause in MS SQL
没有
很遗憾,没有。
SQL(各种形式)是一种用于操作表格行集的声明式方案。像行这样的事物集合没有固有的顺序。
如果 SQL 以任何方式在没有 ORDER BY
语句的情况下碰巧按您期望的顺序传送行,那是巧合。这纯粹是运气。正式地说,如果没有 ORDER BY
,SQL 会以不可预测的顺序传送行。"Unpredictable" 类似于 "random,",但更糟。 Random 意味着您每次 运行 查询时可能会得到不同的顺序:您可以在系统测试中捕捉到这种情况。 不可预测 意味着您每次都得到相同的订单,直到您不这样做为止。现在你不需要了。
这是SQL的基本性质。为什么?现代数据库服务器中的优化器非常聪明,可以尽可能快地准确提供您所要求的内容,并且它们在每个版本中都变得更加智能。 SQL Server 2016 的优化器可能注意到了一些为您的查询使用并发的机会,或类似的东西,并抓住了它们。
你在这里的选择都不愉快:
- 回滚数据库升级。 可能或可能不会解决问题。
- 对您的软件加载进行紧急修复并提前推出。
- 接受错误排序的报告,直到您可以修复您的软件。
我在这里写了一个很长的答案,这样你就可以有有用的论据向你的公司霸主介绍你的情况。你这么解释我不羡慕你
我们有一个大型应用程序。最近,我们升级了数据库 MS SQL 2016。因此,我们在某些报告中遇到输出顺序问题。不幸的是,我们无法更改应用程序的源代码,并且暂时无法这样做。这种行为的原因是某些格式为 "SELECT * FROM table" 的查询没有 "ORDER BY" 子句。
有没有什么创造性的方法来排序输出?想在 SELECT<(我知道没有这样的东西...)> 上添加触发器?还有别的办法吗?任何类型的索引都会成为 ORDER 默认值?
更新:我无法更改源代码。这是已编译的应用程序,升级周期还有几个月。如果可以的话,我会直接查看源代码并更改这些查询。
您问的是:
Is there a way to have ordered output without an ORDER BY clause in MS SQL
没有
很遗憾,没有。
SQL(各种形式)是一种用于操作表格行集的声明式方案。像行这样的事物集合没有固有的顺序。
如果 SQL 以任何方式在没有 ORDER BY
语句的情况下碰巧按您期望的顺序传送行,那是巧合。这纯粹是运气。正式地说,如果没有 ORDER BY
,SQL 会以不可预测的顺序传送行。"Unpredictable" 类似于 "random,",但更糟。 Random 意味着您每次 运行 查询时可能会得到不同的顺序:您可以在系统测试中捕捉到这种情况。 不可预测 意味着您每次都得到相同的订单,直到您不这样做为止。现在你不需要了。
这是SQL的基本性质。为什么?现代数据库服务器中的优化器非常聪明,可以尽可能快地准确提供您所要求的内容,并且它们在每个版本中都变得更加智能。 SQL Server 2016 的优化器可能注意到了一些为您的查询使用并发的机会,或类似的东西,并抓住了它们。
你在这里的选择都不愉快:
- 回滚数据库升级。 可能或可能不会解决问题。
- 对您的软件加载进行紧急修复并提前推出。
- 接受错误排序的报告,直到您可以修复您的软件。
我在这里写了一个很长的答案,这样你就可以有有用的论据向你的公司霸主介绍你的情况。你这么解释我不羡慕你