我们有一个很大的应用程序。最近,我们升级了数据库ms sql 2016。因此,我们在某些报告中遇到了输出顺序问题。不幸的是,我们不能修改应用程序的源代码,暂时也不能这样做。这种行为的原因是某些格式为“select*fromtable”的查询上没有“orderby”子句。
有没有什么创造性的方法来订购产品?想在select上添加触发器吗?还有别的办法吗?任何类型的索引都会是订单默认值吗?
更新:我不能改变源代码。这是编译应用程序和升级周期是几个月后。如果可以的话,我只需浏览源代码并更改这些查询。
我们有一个很大的应用程序。最近,我们升级了数据库ms sql 2016。因此,我们在某些报告中遇到了输出顺序问题。不幸的是,我们不能修改应用程序的源代码,暂时也不能这样做。这种行为的原因是某些格式为“select*fromtable”的查询上没有“orderby”子句。
有没有什么创造性的方法来订购产品?想在select上添加触发器吗?还有别的办法吗?任何类型的索引都会是订单默认值吗?
更新:我不能改变源代码。这是编译应用程序和升级周期是几个月后。如果可以的话,我只需浏览源代码并更改这些查询。
1条答案
按热度按时间wpcxdonn1#
你问:
在mssql中,有没有一种方法可以在没有orderby子句的情况下对输出进行排序
不。
不幸的是,没有。
sql(在其所有风格中)是一种用于操作表的行集合的声明性方案。像行这样的集合没有固有的顺序。
如果sql,任何风格,没有
ORDER BY
语句,恰好以您期望的顺序传递行,这是一个巧合。纯粹是运气。正式地说,没有ORDER BY
sql以不可预测的顺序传递行。“不可预测”类似于“随机”,但更糟。random意味着每次运行查询时您可能会得到不同的顺序:您可以在系统测试中捕获此类内容。不可预测意味着你每次都会得到相同的订单,直到你没有。现在你没有了。这是sql的基本特性。为什么?现代数据库服务器中的优化器非常聪明,能够以尽可能快的速度准确地交付您所要求的内容,而且每次发布都会变得更加聪明。SQLServer2016的优化器可能注意到了一些为您的查询使用并发性的机会,或者类似的机会,并接受了它们。
你在这里的选择都令人不快:
回滚数据库升级。这可能会也可能不会解决问题。
对软件负载进行紧急修复,并提前推出。
在你能修复软件之前,你要忍受那些错误排列的报告。
我在这里写了一个很长的答案,这样你就可以有一些有用的论据向你的公司老板介绍你的情况。我不羡慕你解释这个。