SQL Server 2008 T-SQL功能不尊重兼容级别

Sim*_*loy 3 t-sql sql-server-2005 sql-server-2008

我无意中在一个包含一个函数的脚本中使用了一些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()
Run Code Online (Sandbox Code Playgroud)

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

在SQL2005实例上,它建议"无法为本地变量分配默认值".

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

我的问题出现了,因为我在SQL2008R2实例上进行开发,并且我假设将目标数据库的兼容级别设置为SQL Server 2005会标记任何无效的T-SQL,尽管这不会发生,或者至少我找不到任何内容防止它发生.

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

gbn*_*gbn 6

这是对的.

兼容级别并不意味着"运行与旧版本完全相同"
这意味着"在修复代码时经常不会中断".

永远不要假设:检查.这是ALDN DATABASE在MSDN上所说的(我的大胆):

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

如果你的目标的SQL Server 2005开发的SQL Server 2005.见开发使用SQL 2008服务器SQL 2005的应用程序