【问题标题】:SQL Server 2008 T-SQL features do not respect compatibility levelsSQL Server 2008 T-SQL 功能不尊重兼容性级别
【发布时间】:2011-10-24 14:55:51
【问题描述】:

我无意中在一个脚本中使用了几个 SQL Server 2008 T-SQL 特性,该脚本包含一个将部署到众多客户数据库(其中一些是 SQL 2005)的函数。

一个冒犯性陈述的例子:

create function dbo.fnThisWontWorkOnSQL2005
    ()
returns varchar(max)
as
begin
    declare @intCounter int = 2
    return @intCounter
end

select dbo.fnThisWontWorkOnSQL2005()

在 SQL2008 实例上,这将返回 2。

在 SQL2005 实例上,这会提示“无法将默认值分配给局部变量。”

但是,在 SQL2008 R2 实例上运行的由兼容性级别设置的 SQL 2005 数据库上,代码运行良好并返回 2。

我的问题出现在我在 SQL2008R2 实例上进行开发时,我假设将目标数据库的兼容性级别设置为 SQL Server 2005 会标记任何无效的 T-SQL,尽管这不会发生,或者至少我可以找不到任何东西来阻止它发生。

有人知道防止这种情况发生的方法吗?我进行了各种搜索,但找不到方法,这对我来说就像一个错误,还是我总是需要在我将部署到的最低 SQL 版本上进行开发?

【问题讨论】:

  • 仅供参考:“delighters”不是正确的词:我猜你的意思是新的“功能”
  • 我只在technet.microsoft.com/en-us/library/cc721270%28SQL.100%29.aspx 的 Microsoft 文章中发现了这个名字,他们称之为 Transact-SQL Delighters Transact-SQL 的喜悦是小的增强,在很大程度上有助于提升编程体验更方便。本节介绍以下 Transact-SQL 的精彩内容:声明和初始化变量、复合赋值运算符、通过 VALUES 子句支持表值构造函数,以及增强的 CONVERT 函数
  • 由非英语母语人士(Itzik 是以色列人)撰写。我会改写:这个词有微妙的暗示,不适合公共论坛

标签: sql-server-2005 tsql sql-server-2008


【解决方案1】:

这是正确的。

兼容性级别并不意味着“完全像旧版本一样运行”
这意味着“在我修复代码时减少中断”。

永远不要假设:检查。这就是ALTER DATABASE says on MSDN 所说的(我的粗体字):

兼容性级别仅提供与 SQL Server 早期版本的部分向后兼容性。使用兼容性级别作为临时迁移辅助来解决由相关兼容性级别设置控制的行为中的版本差异。如果现有 SQL Server 应用程序受到 SQL Server 2008 中行为差异的影响,请转换应用程序以正常工作

如果您以 SQL Server 2005 为目标,请在 SQL Server 2005 上进行开发。也请参阅 developing SQL 2005 application using SQL 2008 server

【讨论】:

  • 我明白了,但这肯定是相反的,因为它提供了向前兼容性,因为 SQL2005 数据库正在运行一段它不应该识别的代码。从微软的角度来看,这也很奇怪。他们不希望我一直使用 SQL2000,直到每个最后的数据库都转换为最新最好的数据库。
  • 当您将 SQL Server 2005 数据库升级到更高版本时,它会升级数据库。它不再是 SQL Server 2005 数据库。尝试将其还原或附加到 SQL Server 2005 服务器:它会失败。这同样适用于服务包和一些修补程序,而不仅仅是发行版。见stackoverflow.com/questions/6857924/…
  • 这是有道理的。我需要更加小心我正在编写的内容,并尽早将脚本写入最低版本号。非常感谢
【解决方案2】:

但是,在由兼容级别设置的 SQL 2005 数据库上运行 一个 SQL2008 R2 实例,代码运行愉快,返回 2。

更改为兼容级别 90 不会将您的数据库更改为 SQL Server 2005 数据库,它仍然是 SQL Server 2008 R2 数据库。

兼容性级别不是为了阻止您在 SQL Server 2008 中执行操作,而是为了使 SQL Server 2005 中的功能与之前在 SQL Server 2008 中的行为方式相同。

【讨论】:

    【解决方案3】:

    好的,这个问题已经回答死了,但进一步杀死它:

    兼容性级别功能旨在帮助确保 SQL Server 2005 应用程序可以在对 SQL Server 2008 实例(或基本上在任何 2 个版本之间)进行最小更改或不更改的情况下工作。它的唯一目的是处理 syntax 中的更改,现有代码在 2008 年(或您正在处理的任何更高版本)下可能无法正常工作。

    即使设置为 80 (SQL Server 2000) 兼容级别,也有大量在 2005 和 2008 数据库中完全可用的东西: - 合并语句 - CTE - 声明参数的默认值 - 新的数据类型(例如 NVarChar(Max)) - 名单还在继续。

    我很尴尬地说,我使用的主系统仍然在 SQL Server 2000 兼容模式下运行,即使我们现在使用的是 SQL Server 2008 R2;我们使用了很多很多新的功能,我们只是没有时间修复我们所有的表格提示。兼容性级别几乎是为像我这样的懒人创建的 :) (或者更确切地说,是为了减少升级摩擦以帮助销售更多新版本的单位并减少旧版本 sql 服务器的必要支持窗口 - 他们自己的目标很好对)。

    【讨论】:

      猜你喜欢
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多