2011-10-24 69 views
3

我在包含一个函数的脚本中无意中使用了一对SQL Server 2008 T-SQL功能,该功能将部署到众多客户数据库中,其中一些将SQL 2005SQL Server 2008 T-SQL功能不考虑兼容性水平

违规语句的一个例子:

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版本?

+0

仅供参考:“deighters”不是正确的词:我猜你的意思是新的“功能” – gbn

+0

我只在Microsoft网站http://technet.microsoft.com/en-us/library/cc721270找到这个名字%28SQL.100%29.aspx这就是他们所称的 Transact-SQL Delighters Transact-SQL提升程序是一项小的增强,它在很大程度上有助于使编程体验更加方便。本节涵盖以下Transact-SQL提取器:声明和初始化变量,复合赋值运算符,通过VALUES子句提供的表值构造器支持,以及增强的CONVERT函数 –

+0

由非母语英语者(Itzik is Israeli)撰写。我将改述:这个词有微妙的泛音不适合公共论坛 – gbn

回答

6

这是正确的。

兼容性级别并不意味着“完全像老版本一样运行”
这意味着“我在修复代码时不太经常破解”。

永不假定:检查。这是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

+0

我明白了,但这肯定是相反的,它提供了向前兼容性,因为SQL2005数据库正在运行一段它不应该识别的代码。 从微软的角度来看,这也很奇怪。他们不希望我留在SQL2000上,直到每个最后的数据库都转换为最新最好的数据库。 –

+1

当您将SQL Server 2005数据库升级到更高版本时,它会升级数据库。它不再是SQL Server 2005数据库。尝试恢复或将其重新附加到SQL Server 2005服务器上:它会失败。这同样适用于服务包和一些修补程序,而不仅仅是发布。请参阅http://stackoverflow.com/questions/6857924/restore-sql-2008-db-r2-to-sql2008-no-r2/6857958#6857958 – gbn

+0

这很有道理。我需要更加小心我写的内容,并尽可能在最早的版本中编写最低版本号。非常感谢 –

2

然而,在SQL 2005数据库上 通过设置兼容级别运行的代码运行愉快地进行了SQL2008 R2实例,并返回2.

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

兼容性级别不会阻止您在SQL Server 2008中执行任何操作,它可以使SQL Server 2005中的函数在SQL Server 2008中的行为与以前的行为一样。

1

OK,这个问题已经回答了死刑,但还杀了它:

兼容级别功能的功能旨在帮助确保SQL Server 2005的应用程序可以用最少的或SQL Server上没有变化工作2008实例(或基本上任何2个版本之间)。它的唯一目的是处理更改语法,其中现有的代码可能会在2008年(或您处理的任何后续版本)中正常工作。

有一个巨大的东西,是在2005年和2008年的数据库非常有用的,即使设置为80(SQL Server 2000中)兼容级别列表: - MERGE语句 - 热膨胀系数 - 为申报参数 默认值 - 新数据类型(例如NVarChar(最大)) - 列表继续。

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