【发布时间】:2018-11-09 00:32:16
【问题描述】:
最近从 SQL Server 2016 升级到 2017 遇到了一个奇怪的错误,我将其缩小为:
select top 1 * from (
select top 1 id from [user]
union all
select 0
) a
现在如果我在 SQL Server 2016 中运行它,我会得到
1
如果我在 2017 年运行它,我会得到
0
如果我将 select top 1 * 更改为 select * 我会得到
1
0
在 SQL Server 2016 和 2017 中...
如果我将查询更新为 order by
select top 1 * from (
select top 1 id from [user]
union all
select 0
) a order by id desc
然后我在 SQL Server 2016 和 2017 中都得到了 1 的正确结果。
这是查询优化器看到'select 0'更快并返回结果吗?
【问题讨论】:
-
没错,你没有
ORDER BY。如果您不提供ORDER BY子句,则从不保证排序。使用TOP 1而不使用ORDER BY意味着您很高兴根据优化器的突发奇想从数据集中期待“随机”行。 -
@SebastianBrosch 啊,很好的发现,谢谢。我们从 2005 > 2008 > 2012 > 2014 > 2016 升级,这段代码从未改变,只是在 2017 年坏了。所以我以前从未遇到过这个问题。谢谢。
标签: sql-server sql-server-2017