Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL Server 2008 T-SQL功能不考虑兼容性级别_Sql Server 2005_Tsql_Sql Server 2008 - Fatal编程技术网

Sql server 2005 SQL Server 2008 T-SQL功能不考虑兼容性级别

Sql server 2005 SQL Server 2008 T-SQL功能不考虑兼容性级别,sql-server-2005,tsql,sql-server-2008,Sql Server 2005,Tsql,Sql Server 2008,我无意中在一个脚本中使用了几个SQLServer2008T-SQL特性,该脚本包含一个函数,该函数将部署到许多客户数据库中,其中一些数据库将是SQL2005 冒犯性陈述的一个例子: create function dbo.fnThisWontWorkOnSQL2005 () returns varchar(max) as begin declare @intCounter int = 2 return @intCounter end select dbo.fnThisW

我无意中在一个脚本中使用了几个SQLServer2008T-SQL特性,该脚本包含一个函数,该函数将部署到许多客户数据库中,其中一些数据库将是SQL2005

冒犯性陈述的一个例子:

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

select dbo.fnThisWontWorkOnSQL2005()
在SQL2008实例上,这将返回2

在SQL2005实例上,建议“不能为局部变量指定默认值”

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

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

有人知道防止这种情况发生的方法吗?我搜索了各种各样的方法,但找不到一种方法,我觉得这是一个bug,还是我总是需要在部署到的最低SQL版本上进行开发?

这是正确的

兼容性级别并不意味着“完全像旧版本一样运行”
它的意思是“在修复代码时减少中断次数”

永远不要假设:检查。下面是我的粗体字:

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

如果您的目标是SQLServer2005,请在SQLServer2005上开发。也看到

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

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


兼容性级别的存在不是为了阻止您在SQL Server 2008中执行操作,而是为了使SQL Server 2005中的函数在SQL Server 2008中的行为与以前相同。

好的,这个问题已经得到了致命的回答,但进一步扼杀了它:

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

在2005年和2008年的数据库中,即使设置为80(SQL Server 2000)兼容级别,也有大量完全可用的东西: -合并语句 -CTEs -声明参数的默认值 -新的数据类型(例如NVarChar(最大)) -这一清单不胜枚举


我很难为情地说,我使用的主系统仍然在SQL Server 2000兼容模式下运行,尽管我们现在使用的是SQL Server 2008 R2;我们使用了很多新的功能,只是从来并没有时间去修复所有的桌面提示。兼容性级别基本上是为像我这样懒惰的人创建的:)(或者更确切地说,是为了减少升级过程中的摩擦,以帮助销售更多新版本的单元,并减少旧版本sql Server上必要的支持窗口—这本身就是一个好目标)。

FYI:“愉悦者”不是正确的词:我猜你指的是新的“功能”我只是在微软的一篇文章中找到了这个名字,他们称之为Transact-SQL Delighters Transact-SQL Delighters是一些小的增强功能,在很大程度上有助于使编程体验更加方便。本节介绍以下Transact-SQL愉悦程序:声明和初始化变量、复合赋值运算符、通过VALUES子句提供的表值构造函数支持,以及由非英语母语人士编写的增强转换函数(Itzik是以色列语)。我将换一种说法:这个词有一些微妙的含义,不适合用于公共场合。我明白了,但这肯定是相反的,因为它提供了前向兼容性,因为SQL2005 db正在运行一段它不应该识别的代码。从微软的角度来看,这也很奇怪。他们不希望我一直使用SQL2000,直到最后一个数据库都转换为最新和最好的数据库。当您将SQL Server 2005数据库升级到更高版本时,它会升级数据库。它不再是SQL Server 2005数据库。尝试将其还原或附加回SQL Server 2005服务器:它将失败。这同样适用于服务包和一些修补程序,而不仅仅是版本。看,这是有道理的。我需要更加小心我在写什么,并尽可能早地将脚本编写成最低版本号。非常感谢