SQL Server 2000到2008迁移 - 使用DISTINCT时的ORDER BY问题

Tar*_*med 1 sql-server sql-server-2008

我们目前正在测试从SQL Server 2000到2008R2的应用程序.

以下声明适用于2000年,而不是2008年.

select distinct left(tz.Zipcode,5) as zipCode
from TerritoryZip tz 
order by tz.Zipcode
Run Code Online (Sandbox Code Playgroud)

错误消息是:

Msg 145, Level 15, State 1, Line 1
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
Run Code Online (Sandbox Code Playgroud)

修复很简单:

select distinct left(tz.Zipcode,5) as zipCode
from TerritoryZip tz 
order by left(tz.Zipcode,5)
Run Code Online (Sandbox Code Playgroud)

但是,我们可能无法找到此类SQL的所有实例.

因此,一种解决方案可能是将兼容性级别设置为2000 - 这样做的缺点是什么(例如,不更新SQL以使用这种更严格的方法的性能)?

还有其他选项/设置,例如是否存在强制执行更好实践的"严格"设置等?

谢谢!!

Aar*_*and 5

您可以通过执行以下操作稍微更改语义:

SELECT ZipCode FROM 
(
  SELECT DISTINCT ZipCode = LEFT(tz.Zipcode, 5)
    FROM dbo.TerritoryZip
) AS x
ORDER BY ZipCode;
Run Code Online (Sandbox Code Playgroud)

不能解决问题,因为查询更冗长,你仍然无法避免触及它.你已经建议的修复在我看来更好,因为它更明确地发生了什么.

不要苛刻,但如果你认为你不能"找到这种SQL的所有实例"那么你如何信任你的测试呢?

我建议保持2000模式不是最佳答案.原因是这可能会导致其他语法中断(例如,您可能会调用动态管理函数的方式 - 请参阅此Paul Randal博客文章及其对此的评论),您还存在使应修复的代码永久存在的风险(例如,样式*=/ =*连接在2000 compat模式下有效,但从2008 R2开始时无效 - > Denali,它不支持2000 compat).

没有"严格"设置,但你可以投票给Erland Sommarskog的SET STRICT_CHECKS ON; 建议.