sql-server-2005 - SQL Server 2008 T-SQL 功能不尊重兼容性级别

标签 sql-server-2005 tsql 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()

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

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

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

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

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

最佳答案

这是正确的。

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

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

Compatibility level provides only partial backward compatibility with earlier versions of SQL Server. Use compatibility level as an interim migration aid to work around version differences in the behaviors that are controlled by the relevant compatibility-level setting. If existing SQL Server applications are affected by behavioral differences in SQL Server 2008, convert the application to work properly

如果您的目标是 SQL Server 2005,请在 SQL Server 2005 上开发。请参阅 developing SQL 2005 application using SQL 2008 server

关于sql-server-2005 - SQL Server 2008 T-SQL 功能不尊重兼容性级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7877582/

相关文章:

sql - 在调试期间观察 SSIS 中的变量

mysql - 如何解决 Windows 7 中 SQL Server 2005 中的错误 233

java - 如何限制表的大小?

sql-server - 查询集封面

sql-server - select语句有值则返回,无值则返回

sql - 查找与多对多关系完全匹配的记录

sql - 如何根据 SQL Server 中的最高点和最低时间计算排名

sql-server - 在存储过程中返回 True 或 False 值

sql - SQL获取记录条数的方法

sql-server - 动态设置 ORDER BY,无需字符串连接