Sql server 兼容级别引发的血案

 

     

错误: 昨天给同事做一个Demo ,就是关于enhance T-Sql PIVOT 的用法 select * from PrivtDemo pivot ( sum([mark]) for [course] in([语文],[数学],[英语])) as pvt 用法发生了如下的错误

              Msg 102, Level 15, State 1, Line 1
              Incorrect syntax near '('.

              当时也考虑是不是兼容问题,但是当时我用的俩个判断依据, 就开始考虑是不是我的语法使用有错误(成功执行过,让我很郁闷,有道是丢什么不能丢人啊!)

 

1.       数据库链接的是Sql Server 2005 的实例(BQCDEV01"DEV

2.         我看见 pivot 能被开发环境识别为关键字

 

 原因分析:           但是一直找不到原因

 

                那究竟是什么原因(google 了下)

                说是兼容级别的问题

                然后我在出现错误的数据库里面执行了下 EXEC   sp_dbcmptlevel   CallCenterEIS,90    

  在执行就OK

      然后为了确定是不是这个原因我又执行了下EXEC   sp_dbcmptlevel   CallCenterEIS,80   

     又开始出现开始出现的错误,这说明错误的原因已经确定就是兼容性问题

     但是为什么出现这个问题

       那就是我是用 Sql Server 2000 的脚本生成的工具 生成的脚本然后在sql server 2005 利用这个脚本生成 2005 的数据库CallCenterEIS,但是Sql Server 2000的脚本里面有一些只有在Sql Server 2000里面经常使用的语法,导致 Sql Server 2005 把这个数据库默认的兼容级别设定为80

 

结论: 如果大家在Sql server 2005 的数据库开发中使用 T-Sql增强的新语法 的时候如果有时候出错找不到原因的时候可以考虑是不是兼容级别的问题

sql server 2000 升级到 sql server 2005 的数据库在开发中如果使用了 sql server 2005 的新语法(xml 操作,排序函数等)会报出一些莫名的错误比如(System.Data.SqlClient.SqlException: 将截断字符串或二进制数据  Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('. ….)等错误,无法排查,其实这些错误都是兼容性的问题

 

 

 PS

 

sp_dbcmptlevel (Transact-SQL)

[本主题为预先发布的文档内容,在未来的版本中可能会更改。包括占位符形式的空白主题。]

将某些数据库行为设置为与指定的 SQL Server 版本兼容。

重要提示:

后续版本的 Microsoft SQL Server 将删除该功能。请不要在新的开发工作中使用该功能,并尽快修改当前还在使用该功能的应用程序。而应使用 ALTER DATABASE

Transact-SQL 语法约定

 语法

sp_dbcmptlevel [ [ @dbname = ] name ] 
    [ , [ @new_cmptlevel = ] version ]

 参数

[ @dbname = ] name

要为其更改兼容级别的数据库的名称。数据库名称必须符合标识符的规则。name 的数据类型为 sysname,默认值为 NULL

[ @new_cmptlevel = ] version

数据库要与之兼容的 SQL Server 的版本。version 的数据类型为 tinyint,默认值为 NULL。该值必须为下列值之一

80 = SQL Server 2000

90 = SQL Server 2005

100 = SQL Server 2008

 返回代码值

0(成功)或 1(失败)

 

 

你可能感兴趣的:(SQL Server)