我们目前正在测试从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以使用这种更严格的方法的性能)?
还有其他选项/设置,例如是否存在强制执行更好实践的“严格”设置......?
谢谢!
答案 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也更直观,并且可以实施更好的最佳实践。