将某些数据库行为设置为与指定的 SQL Server 版本兼容。
Transact-SQL 语法约定
sp_dbcmptlevel [ [ @dbname = ] name ] [ , [ @new_cmptlevel = ] version ]
要为其更改兼容级别的数据库的名称。数据库名称必须符合标识符的规则。name 的数据类型为 sysname,默认值为 NULL。
数据库要与之兼容的 SQL Server 的版本。version 的数据类型为 tinyint,默认值为 NULL。该值必须为下列值之一:
80 = SQL Server 2000
90 = SQL Server 2005
100 = SQL Server 2008
0(成功)或 1(失败)
如果未指定任何参数或未指定 name 参数,则 sp_dbcmptlevel 将返回错误。
如果指定 name 但未指定 version,则 数据库引擎将返回一条消息,显示指定数据库的当前兼容级别。
有关兼容级别的说明,请参阅 ALTER DATABASE 兼容级别 (Transact-SQL)。
只有数据库所有者、sysadmin 固定服务器角色和 db_owner 固定数据库角色的成员(前提是您要更改当前数据库)才能执行此过程。
以下示例将 AdventureWorks 数据库的兼容级别更改为 80。
AdventureWorks
80
EXEC sp_dbcmptlevel AdventureWorks, 80; GO
以下示例阐述了当兼容级别分别为 80 和 90 时 ORDER BY 绑定所存在的差异。此示例在 tempdb 数据库中创建了一个示例表 SampleTable。
tempdb
SampleTable
USE tempdb; CREATE TABLE SampleTable(c1 int, c2 int); GO
在兼容级别 90(默认级别)中,以下 SELECT... ORDER BY 语句将因 AS 子句中的列名 c1 不明确而出现错误。
SELECT... ORDER BY
AS
c1
SELECT c1, c2 AS c1 FROM SampleTable ORDER BY c1; GO
在将该数据库的兼容级别重置为 80 之后,这一 SELECT... ORDER BY 语句将成功执行。
sp_dbcmptlevel tempdb, 80 SELECT c1, c2 AS c1 FROM SampleTable ORDER BY c1; GO
以下 SELECT... ORDER BY 语句在这两个兼容级别中均可正常执行。
SELECT... ORDER B
sp_dbcmptlevel tempdb, 80 SELECT c1, c2 AS c3 FROM SampleTable ORDER BY c1; GO sp_dbcmptlevel tempdb, 90 SELECT c1, c2 AS c3 FROM SampleTable ORDER BY c1; GO
在兼容级别 90(默认级别)中,以下 SELECT...ORDER BY 语句将因 ORDER BY 子句中存在附加的表前缀而出现错误。
SELECT...ORDER BY
ORDER BY
SELECT c1 AS x FROM SampleTable ORDER BY SampleTable.x; GO
在将该数据库的兼容级别重置为 80 之后,这一 SELECT...ORDER BY 语句将成功执行。
sp_dbcmptlevel tempdb, 80 SELECT c1 AS x FROM SampleTable ORDER BY SampleTable.x; GO
以下 SELECT...ORDER BY 语句在这两个兼容级别中均可正常执行。
sp_dbcmptlevel tempdb, 80 SELECT c1 AS x FROM SampleTable ORDER BY x; GO sp_dbcmptlevel tempdb, 90 SELECT c1 AS x FROM SampleTable ORDER BY x; GO