Transact-SQL 参考

sp_dbcmptlevel

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

语法

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

参数

[@name =] name

数据库的名称,将对此数据库的兼容级别进行更改。数据库的名称必须遵循标识符的规则。name 的数据类型为 sysname,默认值为 NULL。

[@new_cmptlevel =] version

数据库要兼容的 SQL Server 版本。version 的数据类型为 tinyint,默认值为 NULL。该值必须为 80、70、65 或 60。

说明  70 和 80 两个级别间的唯一区别是,级别 70 不支持 SQL Server 2000 中引入的一些保留关键字。

返回代码值

0(成功)或 1(失败)

结果集

如果没有指定参数或没有指定 name 参数,sp_dbcmptlevel 将返回下面的消息:

Valid values of database compatibility level are 60, 65, 70, or 80.

如果指定了 version 而没有指定 name,SQL Server 将显示一条有关该数据库的兼容性设置的消息。

注释

在 SQL Server 2000 中,master 数据库的兼容级别为 80,此级别不能改变。

对于安装 SQL Server 2000 的所有实例,所有数据库的默认级别为 80。对于从 SQL Server 7.0 升级到 SQL Server 2000,所有数据库的默认级别为 80。对于从 SQL Server 6.5 和 SQL Server 6.0 升级到 SQL Server 2000,保持现有默认兼容级别。

sp_dbcmptlevel 提供临时迁移帮助。由 sp_dbcmptlevel 的兼容级别设置控制的 SQL Server 7.0 版或 SQL Server 2000 行为中的不同如果影响了现有 SQL Server 6.x 版应用程序,请使用此过程设置早期版本行为,直到能够用 SQL Server 2000 兼容级别将该应用程序转变为正常运行为止。sp_dbcmptlevel 不能还复完全向后兼容。

sp_dbcmptlevel 将影响指定数据库的行为,但不会影响整个服务器。当在 USE 语句中将数据库作为当前数据库,或者当数据库作为登录的默认数据库时,数据库的兼容性设置将生效。当执行存储过程时,将使用在其中定义过程的数据库的当前兼容性级别。当此数据库中的兼容性设置更改时,所有存储过程将重新编译。

将兼容性级别设置为 65 或 60 将影响这些行为。有关向后兼容行为的更多信息,请参见 SQL Server 向后兼容性详细信息

兼容性级别设置为
60 或 65
兼容级别设置为 70 或 80(默认值)
带 GROUP BY 子句但不带 ORDER BY 子句的 SELECT 语句的结果集,将由 GROUP BY 列排序。 GROUP BY 子句本身没有排序功能。必须显式指定 ORDER BY 子句,SQL Server 才能对结果集进行排序。有关更多信息,请参见 SELECT
UPDATE 语句的 SET 子句接受以表的别名作为前缀的列。 在 UPDATE 语句的 SET 子句中,不接受表的别名。在 SET 子句中指定的表或视图必须与指定的紧跟在 UPDATE 关键字后的表或视图相匹配。有关更多信息,请参见UPDATE
在创建 bit 列时,如果在 CREATE TABLE 或 ALTER TABLE 中没有显式地指定 NULL 或 NOT NULL 选项,则 bit 列将按 NOT NULL 创建。 如果没有显式地指定,则 bit 列的为空性由 SET ANSI_NULL_DFLT_ON 或 SET ANSI_NULL_DFLT_OFF 的会话设置决定,或者由数据库设置 SET ANSI NULL DEFAULT 决定。有关更多信息,请参见SET
ALTER COLUMN 子句无法在 ALTER TABLE 上使用。 ALTER COLUMN 子句可在 ALTER TABLE 上使用。有关更多信息,请参见 ALTER TABLE
为表创建的触发器将替换同一类型的任何现有触发器 (INSERT、UPDATE、DELETE)。可以使用 CREATE TRIGGER 的 WITH APPEND 选项创建同一类型的多个触发器。 可以附加相同类型的触发器。触发器的名称必须唯一。假定已经使用了 WITH APPEND 选项。有关更多信息,请参见 CREATE TRIGGER
如果批处理或过程包含无效的对象名,则当分析或编译批处理时,将返回警告消息,并且在执行批处理时,将返回错误信息。 当分析或编译批处理时,不会返回警告消息。当执行批处理时,将返回错误信息。有关延迟的名称解析的更多信息,请参见CREATE PROCEDURE(级别 4)
通过忽略表 Y 并将 SELECT 语句结果插入表 X,下面形式的查询可以正确执行。
INSERT X
SELECT select_list INTO Y
当执行此查询时,SQL Server 将返回语法错误。
空字符串文字 (' ') 将作为一个空格解释。 空字符串文字 (' ') 将作为空字符串解释。
DATALENGTH('') 返回 1(将 '' 解释为一个空格)。
DATALENGTH(N'') 返回 2(将 N'' 解释为一个 Unicode 空格)。
m = 0 时,LEFT('123', m) 返回 NULL。

m = 0 时,LEFT(N'123', m) 返回 NULL。
LTRIM('     ') 返回NULL。
LTRIM(N'     ') 返回 NULL。
m = 0 时,REPLICATE('123', m) 返回 NULL。
m = 0 时,REPLICATE(N'123', m) 返回 NULL。
m = 0 时,RIGHT(N'123', m) 返回 NULL。
m = 0 时,RIGHT('123', m) 返回 NULL。
m 为负数时,RIGHT('123', m) 返回 NULL。
m 为负数时,RIGHT(N'123', m) 返回 NULL。
RTRIM('     ') 返回 NULL。
RTRIM(N'     ') 返回 NULL。
SPACE(0) 返回 NULL。
m 小于字符串长度或者当 n = 0 时,SUBSTRING('123', m, n) 返回 NULL。
m 大于字符串的长度或者当 n = 0 时,SUBSTRING(N'123', m, n) 返回 NULL。
UPDATETEXT table.textcolumn textpointer > 0 NULL NULL 导致 NULL 值。
DATALENGTH('') 返回 0。

DATALENGTH(N'') 返回 0。

m = 0 时,LEFT('123', m) 返回空字符串。
m = 0 时,LEFT(N'123', m) 返回空字符串。
LTRIM('     ') 返回空字符串。
LTRIM(N'     ') 返回空字符串。
m = 0 时,REPLICATE('123', m) 返回空字符串。
m = 0 时,REPLICATE(N'123', m) 返回空字符串。
m = 0 时,RIGHT('123', m) 返回空字符串。
m = 0 时,RIGHT(N'123', m) 返回空字符串。

m 是负数时,RIGHT('123', m) 返回空字符串。

m 为负数时,RIGHT(N'123', m) 返回错误信息。
RTRIM('     ') 返回空字符串。
RTRIM(N'     ') 返回空字符串。
SPACE(0) 返回空字符串。
m 小于字符串的长度或者当 n = 0 时,SUBSTRING('123', m, n) 返回空字符串。
m 大于字符串的长度或者当 n = 0 时,SUBSTRING(N'123', m, n) 返回空字符串。
UPDATETEXT table.textcolumn textpointer > 0 NULL NULL 导致空文本。
仅当模式和表达式同时为空时,CHARINDEX 和 PATINDEX 函数才返回空。 当任何输入参数为 NULL 时,CHARINDEX 和 PATINDEX 函数将返回 NULL。
引用 inserted deleted 表中的 text image 列时,将显示为 NULL。 不允许引用 inserted deleted 表中的 text image 列。
允许 UPDATETEXT 将 text 列初始化为 NULL。 UPDATETEXT 将 text 列初始化为空字符串。WRITETEXT 将 text 列初始化为 NULL。
如果 sp_dboption 的设置选项 concatenation of null yields null 处于关闭状态(禁用),则当串联操作中的任何操作数为空时返回空字符串。 如果 sp_dboption 的设置选项 concatenation of null yields null 处于打开状态(启用),则当串联操作中的任何操作数为空时返回 NULL。
在 INSERT 语句中,允许在 VALUES 子句中使用可以返回标量值的 SELECT。 INSERT 语句不能在 VALUES 子句中将 SELECT 语句用作插入值之一。
由 INSERT table EXEC procedure 语句引用的存储过程中的 ROLLBACK 语句将导致 INSERT 回滚,但批处理继续执行 由 INSERT...EXEC 子句引用的存储过程中的 ROLLBACK 语句将导致整个事务回滚,并使批处理终止执行。
在触发器中检索 inserted deleted 表的 text image 列,将返回 text image 列的 NULL值。 不允许在触发器中检索 inserted deleted 表的 text image 列,否则将出错。

兼容性级别对保留关键字也有影响。下表显示在指定级别上为保留关键字而用在较低级别的对象名中仍有效的单词。在较低兼容性级别上,与较高级别保留关键字对应的语言功能将失效。

兼容性级别
保留关键字
80 COLLATE、FUNCTION、OPENXML
70 BACKUP、CONTAINS、CONTAINSTABLE、DENY、FREETEXT、FREETEXTTABLE、PERCENT、RESTORE、ROWGUIDCOL、TOP
65 AUTHORIZATION、CASCADE、CROSS、DISTRIBUTED、ESCAPE、FULL、INNER、JOIN、LEFT、OUTER、PRIVILEGES、RESTRICT、RIGHT、SCHEMA、WORK

无法在 master 数据库中更改兼容性级别设置,但是可以在 model 数据库中对此进行更改,以使其在所有新建的数据库中生效。无法在存储过程内部或 EXEC('string') 语法执行的 Transact-SQL 字符串中更改兼容性级别。无法在 Transact-SQL 语句的批处理中更改兼容性级别。

权限

只有 DBOsysadmin 固定服务器角色成员、db_owner 固定数据库角色成员(如果即将改变兼容级别的数据库是当前数据库)才能执行此过程。

示例

此示例通过将 pubs 数据库的兼容级别设置为 60 来创建名为 distributed 的过程,distributed 是 SQL Server 保留关键字。

CREATE PROCEDURE distributed 
AS
PRINT 'This won't happen'

EXEC sp_dbcmptlevel 'pubs', 60

CREATE PROCEDURE distributed 
AS
PRINT 'You are in a procedure that could not be defined'
PRINT 'in a version of SQL Server 6.5 or later'
PRINT 'without the compatibility setting.'

EXEC distributed

下面是结果集:

Msg 156, Level 15, State 1
Incorrect syntax near the keyword 'distributed'.
DBCC execution completed. If DBCC printed error messages, see your System Administrator.
You are in a procedure that could not be defined
in a version of SQL Server 6.5 or greater
without the compatibility setting.

请参见

EXECUTE

保留关键字

设置数据库选项

sp_dboption

SQL Server 向后兼容性详细信息

系统存储过程

使用标识符