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

时间:2011-08-31 18:21:52

标签: 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

错误消息是:

Msg 145, Level 15, State 1, Line 1
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

修复很简单:

select distinct left(tz.Zipcode,5) as zipCode
from TerritoryZip tz 
order by left(tz.Zipcode,5)

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:5)

您可以通过以下方式稍微更改语义:

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

不能解决问题,因为查询更冗长,您仍然无法避免触及它。你已经提出的修正案在我看来更好,因为它更明确地说明了发生了什么。

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

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

没有“严格”设置,但您可以投票Erland Sommarskog's SET STRICT_CHECKS ON; suggestion

答案 1 :(得分:3)

  

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

我建议您查看ALTER DATABASE Compatibility Level (Transact-SQL)上的文档,其中列出了兼容性级别与低中高级影响的可能性之间的许多差异。

此外,您应该运行Upgrade Advisor查看您需要修复的潜在问题的组件

答案 2 :(得分:0)

MSDN有一篇非常好的文章,展示了SQL Server 2008中不同兼容级别之间的差异(包括性能注释和最佳实践):http://msdn.microsoft.com/en-us/library/bb510680.aspx。即使在您提供的示例中,2008版本中的SQL也更直观,并且可以实施更好的最佳实践。