SQL Server 2005 中数据库引擎功能的重大更改

更新日期: 2008 年 11 月 17 日

本主题介绍对 Microsoft SQL Server 2005 中的数据库引擎所做的一些更改,这些更改可导致基于早期版本的 SQL Server 的应用程序无法继续使用。

客户端/服务器连接

功能 说明

Banyan VINES 顺序包协议 (SPP)、多协议、AppleTalk 或 NWLink IPX/SPX 网络协议

SQL Server 2005 不支持 Banyan VINES 顺序包协议 (SPP)、多协议、AppleTalk 或 NWLink IPX/SPX 网络协议。客户端应用程序必须使用支持的协议才能连接到 SQL Server 2005。如果设置的某个别名使用了不支持的协议,则必须修改该别名,使其使用支持的协议。

如果应用程序连接字符串通过以下方法之一明确地使用或加载其中一个不支持的协议,则必须对应用程序进行修改,使其使用支持的协议:对 RPC 指定 NETWORK=DBMSRPCN,对 Appletalk 指定 NETWORK=DBMSADSN,对 Banyan VINES 属性指定 NETWORK=DBMSVINN,或者使用显式前缀,例如:对 SPX 使用 spx:server\实例名,对 Banyan VINES 使用 bv:服务器名,对 AppleTalk 使用 adsp:服务器名,以及对多协议使用 rpc:服务器名

有关详细信息,请参阅选择网络协议

MDAC

MDAC 2.6 之前的 MDAC 版本不支持命名实例。若要使应用程序能够连接到命名实例,应升级到 MDAC 的当前版本。

Winsock 代理

不能使用 SQL Server 工具来配置 Winsock 代理。有关如何配置 Winsock 代理的信息,请参阅代理服务器文档。

配置选项

功能

说明

AUTO_UPDATE_STATISTICS

升级任何数据库之前,请先将 AUTO_UPDATE_STATISTICS 设置为 ON。否则,升级到 SQL Server 2005 时,数据库统计信息不会随之更新。如果所依赖的统计信息来自 SQL Server 的早期版本,查询计划有可能不是最佳的。通过将 AUTO_UPDATE_STATISTICS 设置为 ON (开),可让所有统计信息在初次被引用时就获得更新。更新统计信息会增大执行查询时选择更多最佳查询计划的可能性。

ms143179.note(zh-cn,SQL.90).gif注意:

在某些情况下,将 AUTO_UPDATE_STATISTICS 设置为 ON 后,第一次引用统计信息时,更新统计信息的过程可能会影响查询的服务器性能。

若要将 AUTO_UPDATE_STATISTICS 数据库 SET 选项设置为 ON,请使用 ALTER DATABASE 语句;若要更新数据库中的统计信息,请运行 sp_updatestats

max server memory 选项

在 SQL Server 2000 中,如果有足够的系统物理内存,SQL Server 缓冲池可以超过最大服务器内存选项所指定的限制。在 SQL Server 2005 中,缓冲池无法超出最大服务器内存的值。达到此限制时,查询将失败,并显示“系统内存不足”错误。

如果出现此错误,并且已设置最大服务器内存选项,请增大该选项的值或将该值重置为默认值 2147483647。有关详细信息,请参阅服务器内存选项

“查询调控器开销限制”选项

应用 SET GOVERNOR_QUERY_COST_LIMIT 或 sp_configure 的“查询调控器开销限制”选项,可能导致在 SQL Server 的早期版本中能够正常运行的查询无法在 SQL Server 2005 中运行。出现此行为的原因是查询开销建模已更改。

请将连接或服务器实例的查询调控器开销限制设置更新为适当的值,或者将该值设置为 0,以此对查询可运行的时间段不进行任何限制。

数据库、数据和日志文件

功能 说明

压缩驱动器

SQL Server 2005 不能在压缩驱动器上创建或升级数据库。安装 SQL Server 2005 时,为系统数据库选择非压缩驱动器,并验证要升级的数据库不在压缩驱动器上。但是,请注意,在数据库升级之后,可以将只读数据库和只读辅助文件组放在 NTFS 压缩文件系统中。

数据文件

数据文件需要额外的磁盘空间才能处理以下更改:

  • 在每个用户数据库的 PRIMARY 文件组中,将针对数据库对象和用户权限创建和维护附加的系统元数据。例如,在早期版本的 SQL Server 中,与授权者或被授权者相关联的权限作为位图存储在单独一行中。而在 SQL Server 2005 中,位图已扩展到多行。
  • 定义为 textntextimage 数据类型的大型对象 (LOB) 列要求为每列额外增加 40 字节的磁盘空间。在每个 LOB 列的第一次更新过程中会出现这种一次性空间增长。
  • 全文文档 ID (DOCID) 映射存储在数据文件中,而不是全文目录中。

为了确保在升级和后续生产操作期间,资源能够处理大小增长的情况,建议您在升级到 SQL Server 2005 之前,将所有用户数据文件的自动增长设置为 ON。升级并测试工作负荷后,可能需要将自动增长设置为 OFF,或者相应地调整 FILEGROWTH 增量。有关详细信息,请参阅 ALTER DATABASE (Transact-SQL)

数据库兼容模式

在将数据库从 SQL Server 的任何早期版本升级到 SQL Server 2005 之后,该数据库将保留其现有的兼容级别。如果升级后将兼容模式改为 90,则兼容模式的差异可能会影响应用程序。有关这些差异的详细信息,请参阅 sp_dbcmptlevel (Transact-SQL)

数据库 ID 32767

在 SQL Server 2005 中,此数据库 ID 是保留的。请先分离该数据库,然后再升级。

文件组

必须先将 SQL Server 实例中的所有数据库的文件组设置为 READ_WRITE,然后才能升级到 SQL Server 2005。若要将文件组设置为 READ_WRITE,请使用 ALTER DATABASE

日志文件

在 SQL Server 2005 中,事务日志文件需要额外的磁盘空间。在崩溃恢复的撤消阶段,SQL Server 2005 允许用户访问数据库。这是因为崩溃发生时未提交的事务将重新获取它们在崩溃前持有的所有锁。当事务回滚时,锁有助于保护它们不受其他用户的干扰。必须在事务日志中维护此附加锁定信息。

为了确保在升级和后续生产操作期间,资源能够处理大小增长的情况,我们建议您在升级到 SQL Server 2005 之前,将所有用户日志文件的自动增长设置为 ON。升级并测试工作负荷后,可能需要将自动增长设置为 OFF,或者相应地调整 FILEGROWTH 增量。有关详细信息,请参阅 ALTER DATABASE (Transact-SQL)

model 数据库

在 SQL Server 2005 中,model 数据库包含下列更改:

  • 最小大小变大。
  • 兼容级别设置为 90。
  • PAGE_VERIFY 数据库选项设置为 CHECKSUM。

tempdb 数据库

SQL Server 2005 中的 tempdb 数据文件和日志文件需要额外的磁盘空间。为了确保在升级和后续生产操作期间,资源能够处理大小增长的情况,我们建议您在升级到 SQL Server 2005 之前,将所有 tempdb 数据文件和日志文件的自动增长设置为 ON。升级并测试工作负荷后,可能需要将自动增长设置为 OFF,或者相应地调整 FILEGROWTH 增量。

有关详细信息,请参阅解决 tempdb 中磁盘空间不足的问题

功能

功能

说明

扩展存储过程

升级到 SQL Server 2005 后,先前未用 DLL 名称的完整路径注册的扩展存储过程可能无法运行。出现此情况的原因是:升级过程中旧的 BINN 目录没有添加到新的路径中。SQL Server 可能找不到扩展存储过程。

升级到 SQL Server 2005 前,请对每个未使用完整路径名注册的扩展存储过程执行以下步骤:

  1. 若要删除扩展存储过程,请运行 sp_dropextendedproc。
  2. 若要用完整路径名注册扩展存储过程,请运行 sp_addextendedproc。

日志传送

SQL Server 的早期版本中的日志传送与 SQL Server 2005 中的日志传送不兼容,因此无法直接升级。升级到 SQL Server 2005 后,请使用 SQL Server Management Studio 或存储过程重新配置日志传送。有关详细信息,请参阅将 SQL Server 2000 日志传送配置迁移到 SQL Server 2005

osql 实用工具

osql 实用工具不支持 ED 和 **!!**命令。从脚本中删除对 ED 和 **!!**命令的引用。若要使用 ED!! 命令,请改用 sqlcmd 实用工具

SQL-DMO WMI 提供程序

SQL-DMO WMI 提供程序已被废弃,现在已不可用。

SQL Mail

SQL Server 支持升级自 SQL Server 7.0 或 SQL Server 2000 的 SQL Mail;但是 SQL Server 2005 需要 Microsoft Outlook 2002 或更高版本作为邮件客户端。

ms143179.note(zh-cn,SQL.90).gif注意:

后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。若要从 SQL Server 2005 发送邮件,请使用数据库邮件。

SQL Mail

当使用 SQL Server 身份验证连接的客户端尝试发送包含附件的 SQL Mail 时,SQL Server 无法设置适当的安全上下文,将返回一个错误。为了避免此问题,请使用 Windows 身份验证。

SQL 命名空间 API (SQL-NS)

SQL 命名空间 API (SQL-NS) 已废弃,现在已不可用。

跟踪标志

在 SQL Server 2000 中,在会话 A 中设置的跟踪标志不会在已有的会话 B 中自动生效。仅当在会话 B 中首次设置了任何跟踪标志后,该跟踪标志才生效。此行为在 SQL Server 2000 中是不确定性的,而在 SQL Server 2005 中是确定性的。在 SQL Server 2005 中,在会话 A 中设置的全局跟踪标志会立即在其他并发会话中设置。

此外,在 SQL Server 2005 中,DBCC TRACEON 语句的一个附加参数用于指定跟踪标志是局部的还是全局的。如果未指定第二个参数,则在 SQL Server 2005 中,默认值为局部。这与在 SQL Server 2000 中不同,在该版本中,默认值为全局。

有关详细信息,请参阅跟踪标志 (Transact-SQL)

跟踪标志

有些 SQL Server 2000 跟踪标志在 SQL Server 2005 中不存在。此外,一些跟踪标志在 SQL Server 2005 中的功能有所改变。升级到 SQL Server 2005 之前,应先禁用所有跟踪标志。升级之后,验证跟踪标志的功能是否保持不变。在重新启用任何跟踪标志之前,还要先验证是否仍需要该跟踪标志。

触发器

在 SQL Server 2005 中,无法对 DML 触发器中所插入和删除的表执行数据定义语言 (DDL) 语句,如 CREATE INDEX。在 SQL Server 的早期版本中,可对插入和删除的表执行某些 DDL 语句。有关详细信息,请参阅使用插入的和删除的表

重复的索引名称

在 SQL Server 2005 中,不允许表索引名称或视图索引名称重复。请先对重复的索引重命名,没有重复后再升级。

  1. 执行以下查询可以找到重复的索引:

    SELECT DISTINCT OBJECT_NAME(o.id), name
    FROM sysindexes as o
    WHERE EXISTS 
        (SELECT name FROM sysindexes  as i
          WHERE i.id = o.id
          AND i.name = o.name and i.indid < o.indid);
    
  2. 使用 sp_rename 更改其中一个索引名称。由于索引名称相同,因此无法确定哪个索引将被重命名。通过此步骤可以区分这些索引。

    EXEC sp_rename N'table_name.index_name', N'new_index_name, N'INDEX'
    
  3. 通过执行以下查询来验证哪个索引被重命名了。以下查询返回所有索引,其中包括指定表或视图上的键列名:

    SELECT i.name AS IndexName, c.name AS ColumnName, ik.colid, ik.keyno
    FROM sysindexes i
    JOIN sysindexkeys ik ON i.id = ik.id and i.indid = ik.indid 
    JOIN syscolumns c ON c.id = ik.id and ik.colid = c.colid
    WHERE i.id = OBJECT_ID('table_or_view_name')
    
  4. 如有必要,再次使用 sp_rename 更正索引名称。

对象名

在 SQL Server 2005 中,不能在对象名中使用 0xFFFF 字符。当数据库的数据库兼容级别为 90 时,无法访问包含此 Unicode 字符的对象名。请重命名包含此字符的对象。

表变量和列排序规则匹配

在 SQL Server 2000 中,在表变量中定义的列可隐式转换为 tempdb 数据库的排序规则。在 SQL Server 2005 中,在表变量中定义的列可隐式转换为当前数据库的排序规则。依赖 SQL Server 2000 行为的查询可能会返回意外的结果,如不同数量或顺序的返回行。

例如,如果使用的是 TestDB 数据库的排序规则而不是 tempdb 排序规则,则下列 SELECT 语句的 WHERE 子句中的列 c1c2 的相等比较可能返回较少或较多的行。例如,如果排序规则不区分大小写,则值“Name”和“name”在计算时将视为相等,如果区分大小写,则这两个值不会视为相等。

CREATE DATABASE TestDB COLLATE Estonian_CS_AI;
GO
USE TestDB;
DECLARE @TempTable table (c1 varchar(10), c2 varchar(10);
SELECT * FROM @TempTable WHERE c1 = c2;

如果使用的排序规则不同于表变量中的当前数据库排序规则,请在 DECLARE 语句中的列定义中指定排序规则,或在引用这些列的查询中指定排序规则。以下示例显示了这两种方法。

USE TestDB;
DECLARE @TempTable table (c1 varchar(10)COLLATE Latin1_General_CS_AS, c2 varchar(10)COLLATE Latin1_General_CS_AS);
SELECT * FROM @TempTable WHERE c1 = c2;
GO
-- or

DECLARE @TempTable table (c1 varchar(10), c2 varchar(10));
SELECT * FROM @TempTable WHERE c1 = c2 COLLATE Latin1_General_CS_AS;
GO

索引视图

功能 说明

函数确定性

下面的函数表达式在 SQL Server 2005 中被视为具有不确定性,因而可能会防碍索引视图的创建:

  • 对隐式转换为 datetimesmalldatetime 的字符串的引用。
  • 排序规则之间非 Unicode 字符数据的隐式转换。

除非兼容级别设置为 80 或更低,否则涉及将字符串隐式转换为 datetimesmalldatetime 的表达式在 SQL Server 2005 中被认为是不确定性的。这是因为结果取决于服务器会话的 LANGUAGE 和 DATEFORMAT 设置。例如,表达式 CONVERT (datetime, '30 listopad 1996', 113) 的结果取决于 LANGUAGE 设置,因为字符串“listopad”在不同的语句中表示不同的月份。同样,在 DATEADD(mm,3,'2000-12-01') 表达式中,SQL Server 基于 DATEFORMAT 设置解释 '2000-12-01' 字符串。

非 Unicode 字符数据在排序规则间的隐式转换也被视为具有不确定性,除非兼容级别设置为 80 或更低。

数据库兼容级别为 90 时,不允许对包含这些表达式的视图创建索引。尽管已升级的数据库中包含这些表达式的现有视图是可维护的,但是当兼容级别为 80 或 90 时,查询优化器不会在查询计划中考虑这些视图。有关设置兼容级别的信息,请参阅 sp_dbcmptlevel (Transact-SQL)

在 SQL Server 2005 的索引视图定义中,应使用确定性的日期格式样式显式地将文字转换为首选日期类型。有关确定性的日期格式样式的列表,请参阅 CAST 和 CONVERT (Transact-SQL)

如果在已经升级到 SQL Server 2005 的现有索引视图中使用字符串到日期的隐式转换,则应确定数据库与应用程序中的 LANGUAGE 和 DATEFORMAT 设置是一致的,以免损坏索引视图。

IGNORE_DUP_KEY

在 SQL Server 2005,对视图创建唯一聚集索引时,必须将 IGNORE_DUP_KEY 选项设置为 OFF。这是默认设置。将 IGNORE_DUP_KEY 设置为 ON 可导致索引视图损坏。

删除视图的聚集索引,然后在不指定 IGNORE_DUP_KEY 选项的情况下重新创建它。

查询提示

兼容级别为 80 时,索引视图定义中的查询提示被忽略。这会导致一些应用程序在兼容级别为 80 和 90 时的行为不同。有关详细信息,请参阅设计索引视图创建索引视图查询提示 (Transact-SQL)

安全性

功能 说明

登录名

以下固定服务器角色名称在 SQL Server 2005 中是保留名称,因此不能用作用户定义的登录名:

  • sysadmin
  • serveradmin
  • setupadmin
  • securityadmin
  • processadmin
  • dbcreator
  • diskadmin
  • bulkadmin

升级到 SQL Server 2005 之前,请先执行以下步骤:

  1. 执行以下语句记录登录名的安全标识符 (SID):

    SELECT name, sid 
    FROM master.dbo.syslogins 
    WHERE name IN('sysadmin', 'serveradmin','setupadmin',
     'securityadmin','processadmin', 'dbcreator','diskadmin',
     'bulkadmin')
  2. 删除登录名。
  3. 若要创建新的登录名,请使用 sp_addlogin 系统过程。在每个相应登录名的 @sid 参数中,指定步骤 1 中返回的 SID。

登录安全标识符 (SID)

在 SQL Server 2005 中,不允许安全标识符 (SID) 重复。删除其中一个登录名中以及相关联的用户后再升级。

远程登录映射

在早期版本的 SQL Server 中,使用 sp_remoteoption 系统存储过程可以将来自 SQL Server 远程实例的登录标记为可信。但 SQL Server 2005 不支持这种标记远程登录的方法。升级到 SQL Server 2005 后,远程登录将不再被标记为可信。

请使用链接服务器和链接服务器存储过程来设置和管理远程登录。有关详细信息,请参阅链接服务器

SQL Server 6.5 登录名

不再支持 SQL Server 6.5 用于保存密码哈希的格式。无法直接将旧密码升级到 SQL Server 2005。

若要启用此登录名,必须重置其密码。使用 ALTER LOGIN 可以重置密码:

ALTER LOGIN <login name> WITH PASSWORD = '<new password>' MUST_CHANGE

除非禁用策略检查,否则将根据系统的密码复杂性策略来验证新密码。建议使用复杂的密码且不要禁用策略检查。MUST_CHANGE 选项将强制用户选择新密码。这不是必需的,但建议这样做。

使用以下查询可以标识休眠的 SQL Server 6.5 登录名:

SELECT * FROM sysxlogins WHERE (xstatus & 2048) = 2048;
GO

sys 用户名

名称 sys 在 SQL Server 2005 中是保留名称,不能用作用户名。请换一个用户名,然后再升级到 SQL Server 2005。如果未重命名用户,则数据库在升级过程结束之后将处于可疑状态,并在使其在线之前不可用。

升级前的步骤

升级到 SQL Server 2005 之前,在包含用户 sys 的每个数据库中,执行下列操作:

  1. 创建一个新用户。
  2. 使用下列语句显示用户 sys 授予的和授予给用户 sys 的所有权限。

    -- Return permissions granted by user sys.
    SELECT * FROM sysprotects WHERE grantor = USER_ID('sys')
    -- Return permissions granted to user sys.
    SELECT * FROM sysprotects WHERE uid = USER_ID('sys')
  3. 若要将 sys 拥有的所有对象的所有权转给新用户,请使用 sp_changeobjectowner。
  4. 删除用户 sys。
  5. 若要还原在步骤 2 中捕获的原始权限,请使用 GRANT 语句的 AS new_user 子句。
  6. 修改脚本以引用新用户。

升级后的步骤

如果没有在升级前重命名用户 sys,请执行以下操作:

  1. 执行 ALTER DATABASE db_name SET ONLINE 语句。数据库将处于 SINGLE_USER 模式。
  2. 执行“升级前的步骤”部分中的所有步骤。
  3. 执行 ALTER DATABASE db_name SET MULTI_USER 语句。

系统对象和元数据

功能 说明

INFORMATION_SCHEMA.COLUMNS

在 SQL Server 2005 中,INFORMATION_SCHEMA.COLUMNS 视图的 ORDINAL_POSITION 列与 COLUMNS_UPDATED 函数返回的位模式不兼容。

若要获取与 COLUMNS_UPDATED 兼容的位模式,请在查询 INFORMATION_SCHEMA.COLUMNS 视图时引用 COLUMNPROPERTY 系统函数的 ColumnID 属性,如下面的示例所示:

SELECT TABLE_NAME, COLUMN_NAME,
    COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
    COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Contact';

INFORMATION_SCHEMA.SCHEMATA

在 SQL Server 的早期版本中,INFORMATION_SCHEMA.SCHEMATA 视图返回 SQL Server 实例中的所有数据库。在 SQL Server 2005 中,此视图返回数据库中的所有架构。此行为符合 SQL 标准。有关详细信息,请参阅 SCHEMATA (Transact-SQL)

与值“%SCHEMA”匹配的 INFORMATION_SCHEMA 列名

在 SQL Server 的早期版本中,与值“%SCHEMA”匹配的 INFORMATION_SCHEMA 列名返回用户的名称。在 SQL Server 2005 中,这些列返回架构名称。数据库升级到 SQL Server 2005 后,架构名称会始终与用户名相同,因此引用这些列的任何应用程序都不会失败。但是,在数据库中实现 SQL Server 2005 用户-架构分离功能的用户应意识到,如果需要的数据是用户名而不是架构名称,其应用程序可能会失败。

有关详细信息,请参阅用户架构分离

sp_helptrigger

SQL Server 2005 将 trigger_schema 作为最后一列添加在 sp_helptrigger 系统存储过程所返回的结果集中。检查应用程序中是否使用了 sp_helptrigger。可能需要修改应用程序以处理该附加列。另外,也可以使用 sys.triggers 目录视图。

syslockinfo 和 sp_lock

在 SQL Server 2000 中,syslockinfo 中的 rsc_objid 和 rsc_indid 列以及 sp_lock 中的 objid 和 indid 列将返回一致的对象 ID 和索引 ID。在 SQL Server 2005 中,可能会返回值 0。

在 SQL Server 2000 中,对于单个事务中的任何一个特定锁资源,syslockinfo 和 sp_lock 最多返回两行。而在 SQL Server 2005 中,如果启用了锁分区,就可以针对在一个事务中运行的同一资源返回多行。最多可返回 N + 1 行,其中,N 是 CPU 的数目。此外,在 SQL Server 2005 中,可对同一资源显示 GRANTED 和 WAITING 请求;而在 SQL Server 2000 中,不能对同一资源显示这些请求。有关详细信息,请参阅 sp_lock (Transact-SQL)sys.syslockinfo (Transact-SQL)

系统对象名与系统类型名按排序规则进行的匹配

在 SQL Server 的早期版中,系统对象名与系统类型名是按照 master 数据库的排序规则进行匹配的。在 SQL Server 2005 中,系统对象名和系统类型名自动转换为与当前数据库的排序规则相应。如果脚本或应用程序中对这些对象的引用与这些对象在目录中的出现方式不匹配,并且当前数据库的排序规则区分大小写,则该脚本或应用程序可能会失败。例如,如果当前数据库的排序规则区分大小写,则语句 EXEC SP_heLP 将失败。

对系统对象的修改

SQL Server 2005 中不允许进行直接系统目录更新。尝试执行此操作将生成以下错误:

“服务器: 消息 259,级别 16,状态 1,第 1 行”

“不允许对系统目录进行即席更新。”

修改 SQL 脚本,以使用正式且有记录的 API。例如,使用 ALTER DATABASE database_name SET EMERGENCY,而不是对 sysdatabases 系统表运行 UPDATE 语句。

系统对象的删除

DROP TABLE、DROP PROCEDURE 等语句和 sp_dropextendedproc 不能用于删除系统对象,因为这些对象是部署在只读的资源数据库中的。

从您的应用程序中删除所有试图删除系统对象的语句。修改应用程序,使其撤消或拒绝对系统对象的 EXECUTE 权限。另外,可以使用 SQL Server 2005 中的一个外围应用配置器工具来禁用一些系统对象。例如,可使用其中一个外围应用配置器工具禁用或启用 xp_cmdshell 扩展存储过程。

sysperfinfo

在 SQL Server 2005 中,sysperfinfo 对 cntr_value 列返回一个 bigint 值。请修改使用 sysperfinfo 的应用程序,以确保其可以处理 cntr_value 列的 bigint 值。

在 SQL Server 2005 中,sysperfinfo 是一个兼容性视图。应改用 sys.dm_os_performance_counters 动态管理视图。

在搜索条件中用 'dbo' 进行查询的系统表

在 SQL Server 的早期版本中,系统对象属于 dbo,并驻留在 master 数据库中。在 SQL Server 2005 中,系统对象由 sys 拥有,并在逻辑上显示在每个数据库中。查询系统表的语句以及具有指定了用户 dbo 的搜索条件的语句都将失败。

Transact-SQL

功能 说明

@@VERSION

SQL Server 2005 比 SQL Server 2000 返回的信息更详细,其格式为:主版本号.次版本号.内部版本号.增量内部版本号

CREATE STATISTICS

在 SQL Server 2005 中,不支持在 CREATE STATISTICS 语句中指定 WITH ROWS。请通过以下方式修改包含 WITH ROWS 的 CREATE STATISTICS 语句:在 WITH 和 ROWS 间指定 SAMPLE number,或者指定符合已公布的语法的其他选项。

DISK INIT

SQL Server 的早期版本中使用 DISK INIT 语句来创建数据库或事务日志设备,而 SQL Server 2005 中已经删除了该语句。请用等效的 CREATE DATABASE 或 ALTER DATABASE 语句替换所有出现此语句的地方。

INSERT INTO...SELECT 语句中的 UNION

当 UNION 运算符用在 INSERT 语句中时,SQL Server 2005 根据数据类型转换规则独立地转换每个 UNION 运算的数据类型。这样,UNION 操作的最后结果的数据类型将转换为 INSERT 操作的目标表中的相应列。此行为更改可能导致在您的应用程序中出现数据类型转换错误。

下面的示例演示数据类型转换错误。兼容级别为 80 以及更低时,第一个 SELECT 语句中的整数常量 1 直接转换为目标列 ReturnedValue 的数据类型,即 varchar(255)。兼容级别为 90 时,UNION 结果集的数据类型在转换为目标列之前确定。对于第一个 SELECT 语句中的第二列,数据类型被确定为 int。对于第二个 SELECT 语句中的第二列,数据类型被确定为 varchar(4)。由于 int 数据类型的优先级高于 varchar(4) 数据类型,因此当确定 UNION 结果集的数据类型时,值 test 将转换为 int 数据类型,这就会导致数据类型转换错误。

CREATE TABLE #test(ReturnedName varchar(255) NOT NULL,
  ReturnedValue varchar(255) NULL)
INSERT INTO #test 
SELECT 'col1', 1
UNION ALL
SELECT 'test', 'test'
DROP TABLE #test

UPDATETEXT

SQL Server 2005 不支持在使用同一文本指针对同一二进制大型对象 (BLOB) 进行读取和写入的 UPDATETEXT 语句中使用文本指针。请将 BLOB 复制到一个临时表或表变量,然后将值重新赋给原始列。

使用表提示时的 WITH 关键字

在 SQL Server 2005 中,除了一些例外情况之外,仅当使用 WITH 关键字指定了表提示时,查询的 FROM 子句中才支持这些提示。

有关详细信息,请参阅 FROM (Transact-SQL)表提示 (Transact-SQL)

视图定义中的 ORDER BY

在 SQL Server 2005 中,视图定义中的 ORDER BY 子句仅用于确定 TOP 子句返回的行。ORDER BY 不保证在查询视图时得到有序结果,除非在查询本身中也指定了 ORDER BY。

带有锁提示的 UPDATE

在 SQL Server 2000 中,如果以下两个条件都为 True,则不会检查锁提示中是否存在 UPDATE 语句冲突:

  • FROM 子句中的表具有别名。
  • 同一个表被引用为不含别名的 UPDATE 语句的目标。

SQL Server 将忽略 FROM 子句中提供的锁提示,而且在提示冲突时不会发出错误。而在 SQL Server 2005 中,当锁提示在这些条件下冲突时将返回错误。

XML

功能 说明

OPENXML

由于 MSXML 已更改,OPENXML 不再支持非整数的位置谓词。在 SQL Server 2005 中,MSXML 3.0 是用于处理 OPENXML 查询中使用的 XPath 表达式的基础引擎。MSXML 3.0 的引擎更符合 XPath 1.0,在该引擎中,非整数值在位置谓词中的语义已更改。

例如,XPath 表达式 a[5.1] 现在将不返回任何元素,而不是返回第五个 <a> 元素。若要更正此问题,请直接使用舍入值。例如,将上面的示例改为 a[5]

OPENXML XPath 表达式

MSXML 3.0 的 XPath 1.0 引擎更为严格,且删除了对以下函数的支持:

  • format-number()
  • formatNumber()
  • current()
  • element-available()
  • function-available()
  • system-property()

对于 format-number() 和 formatNumber(),可以使用 Transact-SQL。对于其他不支持的函数,没有直接的解决方法。

用户定义类型“xml”

在 SQL Server 2005 中,xml 是保留的系统类型。请在升级前或升级后使用 sp_rename 重命名该类型,并修改应用程序,使其使用新的类型名称。

请参阅

参考

SQL Server 2005 中数据库引擎功能的行为更改
SQL Server 2005 中不推荐使用的数据库引擎功能
SQL Server 2005 中废弃的数据库引擎功能

其他资源

SQL Server 2005 数据库引擎的向后兼容性
sp_dbcmptlevel (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

版本 历史记录

2008 年 11 月 17 日

新增内容:
  • 在“功能”部分下添加了有关表变量中列排序规则匹配的内容。

2006 年 4 月 14 日

新增内容:
  • 在 Transact-SQL 部分中添加了有关在视图定义中使用 ORDER BY 的内容。
  • 在 Transact-SQL 部分中添加了有关在 UPDATE 中使用锁提示的内容。