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

语法

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

参数

@dbname = ] name

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

@new_cmptlevel = ] version

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

60 = SQL Server 6.0

65 = SQL Server 6.5

70 = SQL Server 7.0

80 = SQL Server 2000

90 = SQL Server 2005

ms178653.note(zh-cn,SQL.90).gif注意:
不推荐使用值 60 和 65,以后的版本中将删除这两个值。

ms178653.Caution(zh-cn,SQL.90).gif注意:
SQL Server Management Studio 和 SQL Server 管理对象 (SMO) 不支持兼容级别 60。如果将 SMO 或 Management Studio 用于兼容级别设置为 60 的数据库,则执行某些操作时会产生错误。

返回代码值

0(成功)或 1(失败)

结果集

如果未指定任何参数或未指定 name 参数,则 sp_dbcmptlevel 将返回错误。

如果指定 name 但未指定 version,则 SQL Server 2005 数据库引擎将返回一条消息,显示指定数据库的当前兼容级别。

备注

对于所有 SQL Server 2005 安装,默认的兼容级别都为 90。除非 model 数据库有更低的兼容级别,否则 SQL Server 2005 中创建的数据库会设置为该级别。在将数据库从 SQL Server 的任何早期版本升级到 SQL Server 2005 之后,该数据库将保留其现有的兼容级别。这既适用于系统数据库也适用于用户数据库。可使用 sp_dbcmptlevel 将数据库的兼容级别更改为 90。若要查看数据库的当前兼容级别,请查询 sys.databases 目录视图中的 compatibility_level 列。

使用 sp_dbcmptlevel 以获得向后兼容性

sp_dbcmptlevel 存储过程只影响指定数据库的行为,而不影响整个服务器的行为。sp_dbcmptlevel 只提供与 SQL Server 的早期版本的部分向后兼容性。将sp_dbcmptlevel 用作中间迁移助手,可解决相关兼容级别设置所控制的行为之间存在的版本差异问题。如果现有 SQL Server 应用程序受到 SQL Server 2005 中行为差异的影响,请对该应用程序进行转换,使之能正常运行。然后使用 sp_dbcmptlevel 将兼容级别更改为 90。数据库的新兼容性设置将在该数据库下次成为当前数据库(无论是在登录时作为默认数据库还是在 USE 语句中指定)时生效。

包含索引视图的数据库的兼容级别不能更改为低于 80。

最佳实践

如果在用户连接到数据库时更改兼容级别,可能会使活动查询产生不正确的结果集。例如,如果在编写查询计划时兼容级别发生更改,则编写后的计划可能同时基于旧的和新的兼容级别,从而造成计划不正确,并可能导致结果不准确。此外,如果将计划放在计划缓存中供后续的查询重用,则问题可能更加复杂。为了避免查询结果不准确,建议您使用以下过程来更改数据库的兼容级别:

  1. 通过使用 ALTER DATABASE SET SINGLE_USER,将数据库设置为单用户访问模式。
  2. 更改数据库的兼容级别。
  3. 通过使用 ALTER DATABASE SET MULTI_USER,将数据库设为多用户访问模式。
  4. 有关设置数据库访问模式的详细信息,请参阅 ALTER DATABASE (Transact-SQL)。

SET 选项

新功能可以在旧的兼容级别下正常运行,但是可能需要调整 SET 选项。例如,在兼容级别 80 下使用 xml 数据类型需要相应的 ANSI SET 选项。而且,数据库兼容级别设置为 90 时,如果将 ANSI_WARNINGS 设置为 ON,将使 ARITHABORT 隐式设置为 ON。如果将数据库兼容级别设置为 80 或更低,则必须将 ARITHABORT 选项显式设置为 ON。有关详细信息,请参阅影响结果的 SET 选项。

兼容级别和存储过程

执行某一存储过程时,该存储过程将使用定义它的数据库的当前兼容级别。在更改某一数据库的兼容性设置时,该数据库的所有存储过程都将随之自动重新编写。

有关使用 sp_dbcmptlevel 的环境方面的注意事项

每个 sp_dbcmptlevel 调用都必须单独提交。sp_dbcmptlevel 不能使用其他上下文中的调用,例如:

  • 存储过程。
  • 用 EXEC(string) 语法执行的 Transact-SQL 字符串。
  • Transact-SQL 语句的批处理。

级别 60 或 65 与级别 70、80 或 90 之间的差异

将兼容级别设置为 60 或 65 将会影响许多行为。其中包括下表中左边的列所列出的行为。

ms178653.note(zh-cn,SQL.90).gif注意:
有关影响 6.x 应用程序的其他差异,请参阅本主题后面的“较低兼容级别和级别 90 之间的差异”以及“备注”部分中的 6.x 后版本的保留关键字。

兼容级别设置为 60 或 65 兼容级别设置为 70 或更高

带 GROUP BY 子句但不带 ORDER BY 子句的 SELECT 语句的结果集,将按 GROUP BY 列排序。

GROUP BY 子句本身没有排序功能。必须显式指定 ORDER BY 子句,SQL Server 才能对任意结果集进行排序。有关详细信息,请参阅 SELECT (Transact-SQL)。

UPDATE 语句的 SET 子句接受以表的别名作为前缀的列。

在 UPDATE 语句的 SET 子句中,不接受表的别名。在 SET 子句中指定的表或视图必须与指定的紧跟在 UPDATE 关键字后的表或视图相匹配。有关详细信息,请参阅 UPDATE (Transact-SQL)。

在创建 bit 列时,如果在 CREATE TABLE 或 ALTER TABLE 中没有显式地指定 NULL 或 NOT NULL 选项,则该列将按 NOT NULL 创建。

如果没有显式地指定,则 bit 列的为空性由 SET ANSI_NULL_DFLT_ON/SET ANSI_NULL_DFLT_OFF 的会话设置决定,或者由 SET ANSI NULL DEFAULT 的数据库设置决定。有关详细信息,请参阅 SET (Transact-SQL)。

ALTER COLUMN 子句无法在 ALTER TABLE 上使用。

ALTER COLUMN 子句可在 ALTER TABLE 上使用。有关详细信息,请参阅 ALTER TABLE (Transact-SQL)。

为表创建的触发器将替换同一类型的任何现有触发器 (INSERT、UPDATE、DELETE)。可以使用 CREATE TRIGGER 的 WITH APPEND 选项创建同一类型的多个触发器。

可以附加相同类型的触发器。触发器的名称必须唯一。假定已经使用了 WITH APPEND 选项。有关详细信息,请参阅 CREATE TRIGGER (Transact-SQL)。

如果批处理或过程包含无效的对象名,则当分析或编写批处理时,将返回警告消息,并且在执行批处理时,将返回错误信息。

对于本地无效对象,在分析或编写批处理时,将不返回警告,但在执行批处理时,将返回错误信息。

但对于远程无效对象,不支持延迟名称解析 (DNR);如果在某一过程中使用无效的远程表,则该过程的创建将失败,并返回错误。

DNR 支持(在编写期间,引用执行之前均不存在的对象的功能)只适用于表或视图名称。有关延迟名称解析的详细信息,请参阅CREATE PROCEDURE (Transact-SQL)。
ms178653.note(zh-cn,SQL.90).gif注意:

通过忽略表 Y 并将 SELECT 语句结果插入表 X,以下形式的查询可以正确执行。

INSERT X
SELECT select_list INTO Y

Microsoft SQL Server 7.0 或更高版本在执行同一查询时,将返回语法错误。

空字符串文字 (' ') 将解释为一个空格。

空字符串文字 (' ') 将解释为空字符串。

DATALENGTH('') 返回 1(将 '' 分析为一个空格)。

DATALENGTH(N'') 返回 2(将 N'' 分析为一个 Unicode 空格)。

DATALENGTH('') 返回 0。

DATALENGTH(N'') 返回 0。

LEFT('123', 0) 返回 NULL。

LEFT(N'123', 0) 返回 NULL。

LEFT('123', 0) 返回空字符串。

LEFT(N'123', 0) 返回空字符串。

LTRIM(' ') 返回 NULL。

LTRIM(N' ') 返回 NULL。

LTRIM(' ') 返回空字符串。

LTRIM(N' ') 返回空字符串。

REPLICATE('123', 0) 返回 NULL。

REPLICATE(N'123', 0) 返回 NULL。

REPLICATE('123', 0) 返回空字符串。

REPLICATE(N'123', 0) 返回空字符串。

RIGHT(N'123', 0) 返回 NULL。RIGHT('123', 0) 返回 NULL。

当 integer_expression 为负时,RIGHT('123', integer_expression) 返回 NULL。

当 integer_expression 为负时,RIGHT(N'123', integer_expression) 返回 NULL。

RIGHT('123', 0) 返回空字符串。

RIGHT(N'123', 0) 返回空字符串。

当 integer_expression 为负时,RIGHT('123', integer_expression) 返回错误。当integer_expression 为负时,RIGHT(N'123', integer_expression) 返回错误。

RTRIM(' ') 返回 NULL。

RTRIM(N' ') 返回 NULL。

RTRIM(' ') 返回空字符串。

RTRIM(N' ') 返回空字符串。

SPACE(0) 返回 NULL。

SPACE(0) 返回空字符串。

如果指定的 start 值大于 expression 中的字符数,或者 length 等于 0,则函数 SUBSTRING(expressionstartlength) 返回 NULL;例如,SUBSTRING(N'123', 4, 1) 返回 NULL。

在相同的条件下,SUBSTRING(expressionstartlength) 返回一个由一对单引号分隔的空字符串;例如,SUBSTRING(N'123', 4, 1) 返回 ''。

UPDATETEXT table.textcolumn textpointer 0 NULL NULL 将产生空值。

UPDATETEXT table.textcolumn textpointer 0 NULL NULL 将产生空文本。

仅当模式和表达式同时为 NULL 时,CHARINDEX 和 PATINDEX 函数才返回 NULL。

当任何输入参数为 NULL 时,CHARINDEX 和 PATINDEX 函数将返回 NULL。

对 inserted 和 deleted 表中的 text 或 image 列的引用显示为 NULL。

不允许引用 inserted 和 deleted 表中的 text 或 image 列。

如果从触发器内的 inserted 或 deleted 表中检索 text 或 image 列,则将对 text 或 image 列返回 NULL 值。

不允许从触发器内的 inserted 或 deleted 表中检索 text 或 image 列,否则将出现错误。

允许 UPDATETEXT 将 text 列初始化为 NULL。

UPDATETEXT 将 text 列初始化为空字符串。

WRITETEXT 将 text 列初始化为 NULL。

如果 sp_dboption 的 concatenation of null yields null 设置处于关闭状态(禁用),则当串联操作中的任何操作数为 NULL 时将返回空字符串。

如果 sp_dboption 的 concatenation of null yields null 设置处于打开状态(启用),则当串联操作中的任何操作数为空时将返回 NULL。

在 INSERT 语句中,允许在 VALUES 子句中使用可以返回标量值的 SELECT 语句。

INSERT 语句不能在 VALUES 子句中将 SELECT 语句用作插入值之一。

由 INSERT table EXEC procedure 语句引用的存储过程中的 ROLLBACK 语句将导致 INSERT 语句回滚,但批处理继续执行。

由 INSERT...EXEC 语句引用的存储过程中的 ROLLBACK 语句将导致整个事务回滚,并使批处理终止执行。

较低兼容级别和级别 90 之间的差异

本小节介绍随兼容级别 90 引入的新行为。有关影响兼容级别 80 与较低兼容级别的其他行为差异,请参阅本节后面的“保留关键字”部分。

使用兼容级别 90 时,行为将发生下列变化。

兼容级别设置为 80 或更低 兼容级别设置为 90 影响的可能性

对于 FROM 子句中的锁提示,WITH 关键字始终是可选的。

也存在一些例外情况:仅当用 WITH 关键字指定提示时,才支持在 FROM 子句中使用这些提示。有关详细信息,请参阅 FROM (Transact-SQL)。

支持在警告消息中使用外部联接运算符 *= 和 =*。

不支持使用这两个运算符;应使用 OUTER JOIN 关键字。

在将 ORDER BY 列表中的列引用绑定到在 SELECT 列表中定义的列时,将忽略列的多义性,有时还会忽略列前缀。这可以导致以意外顺序返回结果集。

例如,可以接受具有一个两部分列 (<table_alias>.<column>) 的 ORDER BY 子句,而且该列被用作对 SELECT 列表中的列的引用,但忽略表别名。请考虑下面的查询。

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

执行时,将忽略 ORDER BY 中的列前缀。排序操作对指定的源列 (x.c1) 不按预期方式执行,而是对在查询中定义的派生 c1 列执行。此查询的执行计划将显示:首先计算派生列的值,然后对计算得到的值进行排序。

如果存在列的多义性,则将引发错误。在绑定到 SELECT 列表中所定义的列时,不忽略在 ORDER BY 中指定的列前缀(如果有)。

请考虑下面的查询。

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

执行时,不忽略 ORDER BY 子句中的列前缀。排序操作对指定的源列 (x.c1) 按预期方式执行。此查询的执行计划将显示排序运算符对从 t_table 返回的行排序,然后再对在 SELECT 列表中定义的派生列c1 的值排序。

在 INSERT SELECT 中,如果 UNION 属于不同的数据类型,则每个 UNION 分支都直接转换为 INSERT 目标列的类型。即使本身所使用的联合可能会因不兼容的类型转换而失败,INSERT SELECT 也会使 UNION 成功执行,因为 UNION 的结果类型的分支从不进行转换。

在 SQL Server 2005 中,UNION 的结果类型独立于 INSERT SELECT 而派生。UNION 的每一分支都转换为 UNION 的结果类型,然后转换为 INSERT 的目标列类型。如果 UNION 中有不兼容类型,则第一个转换可能会导致错误。若要以兼容级别 90 运行,则必须修复在 INSERT SELECT 中使用的所有不兼容类型的联合。

当视图或被引用视图使用 TOP 子句时,指定了 WITH CHECK OPTION 子句的视图中无法正确支持通过视图进行插入和更新操作。

当视图或被引用视图使用 TOP 子句时,使用 WITH CHECK OPTION 的视图中不支持通过视图进行插入和更新操作。

可变长度列和固定长度列的 UNION 将生成一个固定长度列。

可变长度列和固定长度列的 UNION 将生成一个可变长度列。

允许在触发器中使用 SET XACT_ABORT OFF。

不允许在触发器中使用 SET XACT_ABORT OFF。

允许在视图中使用(并忽略)FOR BROWSE 子句。

不允许在视图中使用 FOR BROWSE 子句。

ANSI_WARNINGS 不控制域错误。如果 ANSI_WARNINGS 设置为 OFF 并且 ARITHABORT 没有更改,则遵守 ARITHABORT 设置。

域错误由 ANSI_WARNINGS 控制,并且是严重级别为 16 的错误。如果 ANSI_WARNINGS 或 ARITHABORT 为 ON,则将引发错误,而不是返回 NULL 值。此更改可能会破坏依赖于设置为 OFF 的 ARITHABORT 的用户脚本。

如果对远程数据源(OpenRowset 或 OpenQuery)所执行的直接传递查询生成名称重复的列,则除非在该查询中显式命名了这些列,否则将忽略重复的列名。

如果对远程数据源(OpenRowset 或 OpenQuery)所执行的直接传递查询生成列名重复的列,将引发错误。

大小大于 8000 的字符串常量和 varbinary 常量被视为 textntext 或 image

大小大于 8000 的字符串常量和 varbinary 常量被视为varchar(max) 类型(或分别被视为 nvarchar(max) 和varbinary(max))。如果 SELECT 列表包含此类表达式,则这样可以更改使用 SELECT … INTO 创建的表的数据类型。

通过将类型层次结构中优先级较低的比较数转换为优先级较高的类型,从而在各数值类型(smallinttinyintintbigintnumericdecimalsmallmoneymoney)之间进行比较。

数值类型值不经转换便进行比较。这有助于提高性能。但这可能会导致行为发生某些更改,尤其是在转换导致溢出异常的情况下。

使用字符串参数的内置元数据函数在其输入长度大于 4000 个字符的情况下,将截断该输入。

如果截断导致丢失非空格字符,则内置元数据函数会引发错误。

未加引号的标识符中被禁用的字符集保持不变。

Transact-SQL 分析器支持 Unicode 3.2 标准,该标准更改了目前禁止在未分隔标识符中使用的一些国际字符的字符分类。

在出现浮点域错误(即 log() 函数的参数为负)时,SET ANSI_WARNINGS ON 不覆盖 SET ARITHABORT OFF 的设置。如果 ANSI_WARNINGS 为 ON 但 ARITHABORT 为 OFF,则浮点域错误不会导致查询终止。

SET ANSI_WARNINGS ON 完全覆盖 ARITHABORT OFF 设置。在这种情况下,浮点域错误将导致查询终止。

允许在 ORDER BY 子句中使用(并忽略)非整数常量。

不允许在 ORDER BY 子句使用非整数常量。

允许使用空的 SET 语句(未指定 SET 选项)。

不允许使用空的 SET 子句。

没有为派生表所生成的列正确派生 IDENTITY 属性。

为派生表所生成的列正确派生了 IDENTITY 属性。

对浮点数据类型执行运算的算术运算符的可为 Null 性属性始终可以为 Null。

在输入不可为空并且 ANSI_WARNINGS 为 ON 的情况下,对浮点数据类型执行运算的算术运算符的为空性属性将更改为不可为空值。

在使用 UNION 组合的 INSERT ..SELECT 语句中,由各个结果集生成的类型都将转换为目标结果类型。

在使用 UNION 组合的 INSERT ..SELECT 语句中,确定各分支的主要类型,并在将结果转换为目标表类型之前将其转换为该类型。

在 SELECT ..FOR XML 语句中,始终实体化 hex(27)(' 字符)和 hex(22)(" 字符),即使在不需要的情况下也是如此。

FOR XML 只在需要时才实体化 hex(27) 和 hex(22)。在下列情况下不实体化这些字符:

  • 在属性内容中,如果属性值以 " 分隔,则不实体化 hex(27)(' 字符);如果属性值以 ' 分隔,则不实体化 hex(22)("字符)。
  • 在元素内容中,从不实体化 hex(27) 和 hex(22)。

在 FOR XML 中,时间戳值映射为整数。

在 FOR XML 中,时间戳值映射为二进制值。

有关详细信息,请参阅 timestamp 数据类型的 FOR XML 支持。

如果使用timestamp列,则为高;否则为低

在 FOR XML 和 OPENXML 中,名称中大范围 Unicode 字符(3 字节)使用 8 位表示。

例如,FOR XML 用 8 位表示 Unicode 码位 U+10000 的方式如下:

<a_x00010000_ c1="1" />

在 FOR XML 和 OPENXML 中,名称中大范围 Unicode 字符(3 字节)使用 6 位表示。

例如,FOR XML 用 6 位表示 Unicode 码位 U+10000 的方式如下:

<a_x010000_ c1="1" />

在 FOR XML 中,使用 AUTO 模式的派生表映射被视为是透明的。

例如:

USE AdventureWorks
CREATE TABLE Test(id int);
INSERT INTO Test VALUES(1);
INSERT INTO Test VALUES(2);
SELECT * FROM (SELECT a.id AS a, 
b.id AS b FROM Test a 
JOIN Test b ON a.id=b.id) 
Test FOR XML AUTO;

如果 AdventureWorks 的兼容级别设置为 80,则以上示例将生成:

<a a="1"><b b="1"/></a>

<a a="2"><b b="2"/></a>

在 FOR XML 中,使用 AUTO 模式的派生表映射被视为是不透明的。

如果 AdventureWorks 的兼容级别设置为 90,则以上示例将生成:

<Test a="1" b="1"/>

<Test a="2" b="2"/>

有关更改为 AUTO 模式的详细信息,请参阅 AUTO 模式的增强功能。

如果对视图应用 FOR XML AUTO 模式,则为高;否则为低

仅在日语和朝鲜语中,字符串到 money 的转换才支持使用反斜杠字符 (\) 作为货币符号。

在所有语言中,所有字符串到 money 的转换中都接受反斜杠字符 (\)。当 \ 用作货币符号时,ISNUMERIC 将返回 True。

对于 SQL Server 2005 之前的 SQL Server 版本上的数据库,这一新行为会拆分依赖于包含 \ 的 ISNUMERIC 返回值并且所使用的语言既不是日语也不是朝鲜语的索引和计算列。

即使操作数不可为 Null 并且 ANSI_WARNINGS 或 ARITHABORT 设置为 ON,算术运算符的结果也始终可为 Null。

在 ANSI_WARNINGS 或 ARITHABORT 设置为 ON 时,如果两个操作数都不可为空,则浮点算术运算符的结果也不可为空值。

在以下情况中,这种为空性的更改可能导致错误:使用 bcp 从包含计算列(该计算列使用浮点算术运算符)的 SQL Server 2000 表中大容量导出二进制格式的数据,然后使用 bcp 或 BULK INSERT 将这些数据大容量导入包含同一定义的 SQL Server 2005 表。

当两个选项均为 OFF 时,数据库引擎 将把结果标记为可以为 Null。这与 SQL Server 2000 中相同。
ms178653.note(zh-cn,SQL.90).gif注意:

对于以 nvarchar 作为参数的内置函数,如果所提供的值为 varchar,则该值将转换为 nvarchar(4000)。在 SQL Server 2000 中,如果传递较大值,则该值将自行截断。

对于以 nvarchar 作为参数的内置函数,即使所提供的值为varchar,该值仍将转换为 nvarchar(4000)。但如果传递较大值,SQL Server 2005 将生成错误。

若要以兼容级别 90 运行,必须修复依赖于截断行为的所有自定义代码。

固定长度(charbinary 或 nchar)字符串与可变长度(varcharvarbinarynvarchar)字符串的联合返回固定长度的结果。

可变大小字符串和固定大小字符串的联合返回可变大小字符串。

若要以兼容级别 90 运行,那么对于任何地方(索引、查询和计算列),只要它依赖与将可变大小类型和固定大小类型求并集得到的类型,就必须修复。

包含字符 0xFFFF 的对象名是有效标识符。

包含字符 0xFFFF 的对象名是无效标识符,不能访问。

若要以兼容级别 90 运行,必须重命名包含此字符的对象。

在 SELECT ISNUMERIC('<string>') 中,<string> 内嵌入的逗号非常重要。

例如,以下 SELECT ISNUMERIC('121212,12') 查询返回 0。这指示字符串121212,12 不是数字。

在 SELECT ISNUMERIC('<string>') 中,<string> 内嵌入的逗号可以忽略。

例如,以下 SELECT ISNUMERIC('121212,12') 查询返回 1。这指示字符串 121212,12 是数字。

忽略了 Transact-SQL 语句中保留关键字后面的冒号 (:)。

Transact-SQL 语句中保留关键字后面的冒号 (:) 将导致语句失败。

引用外部查询中的列的子查询中的 GROUP BY 子句成功。

按照 SQL 标准,引用外部查询中的列的子查询中的 GROUP BY 子句返回错误。

保留关键字

兼容性设置还确定了数据库引擎所保留的关键字。下表显示了每个兼容级别所引入的保留关键字。

兼容级别设置 保留关键字

90

EXTERNAL、PIVOT、UNPIVOT、REVERT、TABLESAMPLE

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

在给定兼容级别,保留关键字包括在该级别或较低级别引入的所有关键字。例如,对于兼容级别为 90 的应用程序,将保留上表列出的所有关键字。在较低的兼容级别中,级别 90 的关键字仍保留有效的对象名,但与这些关键字相对应的级别 90 的语言功能将不可用。

一旦引入,关键字便会保持为保留关键字。例如,在兼容级别 70 中引入的保留关键字 BACKUP 也在级别 80 和 90 中保留。

如果某一应用程序使用对其保留级别而言是关键字的标识符,则该应用程序将失败。若要解决这一问题,请用方括号 ([ ]) 或引号 (" ") 括起该标识符;例如,若要将使用标识符EXTERNAL 的应用程序升级为兼容级别 90,可以将该标识符更改为 [EXTERNAL] 或 "EXTERNAL"

权限

只有数据库所有者、sysadmin 固定服务器角色和 db_owner 固定数据库角色的成员(前提是您要更改当前数据库)才能执行此过程。

示例

A. 将兼容级别更改为 SQL Server 2000

以下示例将 AdventureWorks 数据库的兼容级别更改为 80

EXEC sp_dbcmptlevel AdventureWorks, 80;
GO

B. 兼容级别对 ORDER BY 的影响(第 1 种情况)

以下示例阐述了当兼容级别分别为 80 和 90 时 ORDER BY 绑定所存在的差异。此示例在 tempdb 数据库中创建了一个示例表 SampleTable

USE tempdb;
CREATE TABLE SampleTable(c1 int, c2 int);
GO

在兼容级别 90(默认级别)中,以下 SELECT... ORDER BY 语句将因 AS 子句中的列名 c1 不明确而出现错误。

SELECT c1, c2 AS c1FROM SampleTableORDER BY c1;
GO

在将该数据库的兼容级别重置为 80 之后,这一 SELECT... ORDER BY 语句将成功执行。

sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c1FROM SampleTableORDER BY c1;
GO

以下 SELECT... ORDER BY 语句在这两个兼容级别中均可正常执行。

sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GOsp_dbcmptlevel tempdb, 90
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO

C. 兼容级别对 ORDER BY 的影响(第 2 种情况)

在兼容级别 90(默认级别)中,以下 SELECT...ORDER BY 语句将因 ORDER BY 子句中存在附加的表前缀而出现错误。

SELECT c1 AS xFROM SampleTableORDER BY SampleTable.x;
GO

在将该数据库的兼容级别重置为 80 之后,这一 SELECT...ORDER BY 语句将成功执行。

sp_dbcmptlevel tempdb, 80
SELECT c1 AS xFROM SampleTableORDER BY SampleTable.x;
GO

以下 SELECT...ORDER BY 语句在这两个兼容级别中均可正常执行。

sp_dbcmptlevel tempdb, 80
SELECT c1 AS xFROM SampleTableORDER BY x;
GO
sp_dbcmptlevel tempdb, 90
SELECT c1 AS xFROM SampleTableORDER BY x;
GO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 优化分组 sql语句,Oracle SQL语句之常见优化方法 五

0、低效SQL语句查询:SELECT b.sql_text, --SQL內容a.sid,a.serial#,a.status,a.machine, --哪台机器運行的SQLa.username, --用戶a.module, --運行方式a.action, --Responsibilityc.opname,c.target,c.message,c.sofar totalwork * 100, --工作執行了百分之多少c.elapsed_secon…

我将 20 年前开发的操作系统迁移到 .NET 6,竟然成功了!

作者 | Scott Hanselman译者 | 弯月早在2001年&#xff0c;我用C#为学校的一门300系列的操作系统课程编写了一个微型虚拟操作系统&#xff0c;后来在2002年将其移植到了VB.NET。这些都是在.NET Core出现之前的代码&#xff0c;基于Windows早期的.NET 1.1或2.0。五年前&#xff…

bzoj2132: 圈地计划

要分成两坨对吧。。 所以显然最小割 但是不兹辞啊。。 最小割是最小的啊 求最大费用怎么玩啊 那咱们就把所有费用都加起来&#xff0c;减掉一个最小的呗 但是两个属于不同集合的点贡献的价值是负的啊 网络流怎么跑负的啊 那咱就交换一下呗 原图是二分图啊&#xff0c;把另一部分…

BEVFormerV2 论文阅读

论文链接 BEVFormer v2: Adapting Modern Image Backbones to Bird’s-Eye-View Recognition via Perspective Supervision 0. Abstract 提出了一种新颖的 BEV 检测器&#xff0c;具有透视监督&#xff0c;收敛速度更快&#xff0c;更适合现代图像基础架构优先考虑通过引入透…

光磁记录实现数据冷存储

通过一定强度的短脉冲可以在掺杂了钴离子的钇铁石榴石的磁性层上记录数据。据开发商介绍&#xff0c;这种新颖的光学存储机制有可能成为一种通用的、节能型数据存储技术&#xff0c;并替代现有的存储技术&#xff0c;这源于该技术能够完成超低热度的快速磁盘读写过程&#xff0…

aop在项目中的实际运用_【消防验收】防火玻璃在实际运用中的四大关键问题

扫码入群&#xff0c;与消防企业同行交流&#xff01;防火玻璃虽然开始在建筑中大量使用&#xff0c;但如何正确使用防火玻璃&#xff0c;使用哪种类型的防火玻璃&#xff0c;哪些部位可以使用防火玻璃等问题在实际运用中仍有很多盲区。同时&#xff0c;很多建设单位、设计单位…

CondenserDotNet - 使用 Kestrel 和 Consul 的 API 反向代理库!

简介CondenserDotNet - 使用 Kestrel 和 Consul 的 API 反向代理库&#xff01;特点•Consul 客户端库&#xff0c;包括服务注册、发现和配置•反向代理•交互式 UI&#xff0c;用于查看有关代理的统计信息配置示例配置遵循 LIFO 策略&#xff0c;以最后注册的配置为准var conf…

pdf转tiff

概述 基于Java&#xff0c;将pdf转成单一的tiff文件。 MAVEN依赖 <groupId>com.sun.media</groupId><artifactId>jai_codec</artifactId><version>1.1-mr</version> </dependency> <dependency><groupId>javax.media<…

配置PHP启动Apache服务报错

为什么80%的码农都做不了架构师&#xff1f;>>> 在新的服务器&#xff08;centos 6.3&#xff09;编译安装完php-5.4.8&#xff0c;再配置好php.ini和httpd.conf后&#xff0c;启动apache-2.4.3的时候&#xff0c;命令执行/usr/local/apache2/bin/apachectl start时…

嵌入式WiFi芯片价格战已经打响 MCU企业该醒悟了

在物联网万物互联的驱动下&#xff0c;无可厚非&#xff0c;嵌入式WiFi芯片市场成为了“引爆点”&#xff0c;预计2016年的总出货量将达到1亿颗。面对如此巨大的“诱惑”&#xff0c;国内外WiFi芯片企业自然干劲十足&#xff0c;本想好好大干一场。万万没想到&#xff0c;WiFi芯…

linux系统下图像处理开发板,Linux系统入门教程:五大图像处理软件

发文章时&#xff0c;总免不了要用图片说话。经过长时间的磨合&#xff0c;在Linux桌面系统下有几款图片处理软件我已经用得比较顺手了。这几款软件在Linux世界使用广泛&#xff0c;各个Linux发行版的软件仓库中都有自带的安装包&#xff0c;而且这几款软件运行稳定、界面美观。…

BZOJ1001 狼抓兔子 终于过了!

时间来不及了&#xff0c;先贴代码吧&#xff01;有时间再写。 好苦逼啊&#xff0c;WA了若干次&#xff0c;还有一次RE&#xff0c;一次TLE。 虽然主要运用的算法和资料都由师兄提供了。还是太弱了&#xff0c;太天真了。 首先&#xff0c;数据范围就WA了&#xff0c;RE了&…

如何使用GeneralUpdte构建客户端自动升级功能

一、概要本篇文章将向各位小伙伴介绍GeneralUpdate组件的使用&#xff0c;帮助第一次接触开发者快速上手应用在自己或企业项目中。如果本篇文章对您有帮助&#xff0c;希望帮忙点一下star。感谢各位开发者的支持。帮助文档讲解视频&#xff1a;https://www.bilibili.com/video/…

30道四则运算题目---课堂作业--软件工程c++

问题&#xff1a;设计一程序&#xff0c;给二年级小学生随机产生四则运算题目。 一、设计思考问题&#xff1a; 1.四则运算需要俩个运算数和一个运算符。 2.如何产生随机数? 3.如何实现随机产生四则运算&#xff1f; 4.题目是否符合小学生学习范围&#xff1f;&#xff08;减法…

javascript 函数属性prototype(转)

在JavaScript中并没有类的概念&#xff0c;但javascript中的确可以实现重载&#xff0c;多态&#xff0c;继承。这些实现其实方法都可以用JavaScript中的引用和变量作用域结合prototype来解释。 1、prototype 在JavaScript中并没有类的概念&#xff0c;但JavaScript中的确可以实…

java离职交接文档_财务人员工作交接你知道么?没处理好不止将来风险大还可能违法...

今天给大家分享一下在工作中&#xff0c;财务人员应该怎么保护自己&#xff1f;1.虚假报销那些事儿在企业内部报销程序中&#xff0c;部分管理人员往往安排下属或助理经办报销程序&#xff0c;所有的费用申请、报销单据的填写均系下属完成&#xff0c;而一旦虚假报销案件浮出水…

SQL Server 数据库没有有效所有者的三种解决办法

问题描述: 开发的过程中,操作系统出了问题,决定重装系统。但是没有将SQL Server中的数据库文件分离出来,直接将系统格了。在新系统数据库中附加了数据库文件,一切还算正常,但当打开数据库关系图的时候出现了问题,如下图所示: 针对以上问题,网上有很多解决办法,但是由…

Javascript:原型模式类继承

原型模式每个函数&#xff08;准确说不是类、对象&#xff09;都有一个prototype属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象。使用原型对象的好处是可以让所有对象实例共享它包含的属性和方法。1.原型对象&#xff08;1&#xff09;当创建一个新函数&#xf…

C# 学习经验分享

NET 20 周年的学习挑战赛刚结束了第⼀阶段&#xff0c;不知道各位⼩伙伴参加了没有&#xff1f;有⼈问现在学习 C# 是不是有点过时&#xff1f;也有⼈问现在C# 能做什么&#xff1f;更有⼈问学习 C# 能否找到⼯作 &#xff1f;或者你从不同的专家&#xff0c;不同的从业者可以有…

有限服务器延时计算_机房设备功率统计,UPS不间断电源和蓄电池的计算选择

当然了&#xff0c;也可以不用这么麻烦&#xff0c;网上有UPS计算器的&#xff0c;输入条件直接求个结果就行了。弱电笔记&#xff5c;弱电&#xff08;安防&#xff09;计算器诺&#xff0c;就上面那个&#xff01;下面进入正文&#xff1a;一个计算机机房有4台PC机&#xff0…