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

本主题介绍数据库引擎中的重大更改。这些更改可能会导致基于 SQL Server 早期版本的应用程序、脚本或功能无法继续使用。在进行升级时可能会遇到这些问题。有关详细信息,请参阅使用升级顾问来准备升级

排序规则

功能

说明

新排序规则

SQL Server 2008 引入了新的排序规则,这些规则完全符合 Windows Server 2008 提供的排序规则。这 80 个新排序规则以 *_100 版本引用表示,它们的语言准确性得到了改善。如果为服务器或数据库选择新排序规则,请注意,具有旧客户端驱动程序的客户端可能无法识别新排序规则。未被识别的排序规则可能会导致应用程序返回错误并失败。请考虑以下解决方案:

  • 升级客户端操作系统,以更新基础系统排序规则。

  • 如果客户端上安装了数据库客户端软件,则可以考虑对数据库客户端软件应用服务更新。

  • 选择一个现有排序规则,该排序规则会映射到客户端上的一个代码页。

有关详细信息,请参阅设置和更改排序规则

公共语言运行时 (CLR)

功能

说明

CLR 程序集

当数据库升级到 SQL Server 2008 后,将自动安装 Microsoft.SqlServer.Types 程序集以支持新数据类型。升级顾问规则将检测存在名称冲突的任何用户类型或程序集。升级顾问将建议您重命名所有冲突的程序集,并重命名所有冲突的类型或在代码中使用由两部分组成的名称来引用该预先存在的用户类型。

如果数据库升级检测到某个用户程序集具有冲突名称,它将自动重命名该程序集,并将数据库置于可疑模式下。

如果在升级过程中存在具有冲突名称的用户类型,则不会采取特殊步骤。升级后,旧的用户类型和新的系统类型将同时存在。用户类型将只能按照由两部分组成的名称使用。

CLR 程序集

SQL Server 2008 会安装 .NET Framework 3.5 SP1,以更新全局程序集缓存 (GAC) 中的库。如果在 SQL Server 数据库中注册了不支持的库,则在升级到 SQL Server 2008 后,SQL Server 应用程序可能会停止工作。这是因为,在 GAC 中为库提供服务或升级库时并不会更新 SQL Server 中的程序集。如果某个程序集同时存在于 SQL Server 数据库和 GAC 中,则该程序集的两个副本必须完全一致。如果不一致,当 SQL Server CLR 集成功能使用该程序集时,将发生错误。有关详细信息,请参阅支持的 .NET Framework 库

升级数据库之后,请使用 ALTER ASSEMBLY 语句对该程序集在 SQL Server 数据库中的副本提供服务或进行升级。有关详细信息,请参阅知识库文章 949080

若要检测是否在应用程序中使用了任何不支持的 .NET Framework 库,请在数据库中运行以下查询。

SELECT name FROM sys.assemblies WHERE clr_name LIKE '%publickeytoken=b03f5f7f11d50a3a,%';

CLR 例程

在 CLR 用户定义函数、用户定义聚合或用户定义类型 (UDT) 内使用模拟可导致应用程序在升级到 SQL Server 2008 后因出现错误 6522 而失败。

下列情况在 SQL Server 2005 中成功,而在 SQL Server 2008 中则失败。针对每种情况提供了相应的解决方案。

  1. 使用模拟的 CLR 用户定义函数、用户定义聚合或 UDT 方法具有 nvarchar(max)、varchar(max)、varbinary(max)、ntext、text、image 或大型 UDT 类型的参数,但在方法中没有 DataAccessKind.Read 属性。

    若要解决此问题,请在方法中添加 DataAccessKind.Read 属性,重新编译程序集并重新部署例程和程序集。

  2. 具有用于执行模拟的 Init 方法的 CLR 表值函数。

    若要解决此问题,请在方法中添加 DataAccessKind.Read 属性,重新编译程序集并重新部署例程和程序集。

  3. 具有用于执行模拟的 FillRow 方法的 CLR 表值函数。

    若要解决此问题,请从 FillRow 方法中删除模拟。不要使用 FillRow 方法访问外部资源。而应通过 Init 方法访问外部资源。

动态管理视图

视图

说明

sys.dm_os_sys_info

删除了 cpu_ticks_in_ms 和 sqlserver_start_time_cpu_ticks 列。

sys.dm_exec_query_resource_semaphores sys.dm_exec_query_memory_grants

resource_semaphore_id 列不是 SQL Server 2008 中的唯一 ID。此更改会对故障排除查询执行造成影响。有关详细信息,请参阅 sys.dm_exec_query_resource_semaphores

错误和事件

功能

说明

登录错误

在 SQL Server 2005 中,当使用 SQL 登录名连接到配置为仅使用 Windows 身份验证的服务器时,会返回错误 18452。在 SQL Server 2008 中,则会返回错误 18456。

显示计划

功能

说明

显示计划 XML 架构

向显示计划 XML 架构中添加了一个新的 SeekPredicateNew 元素,并且将封闭 xsd 序列 (SqlPredicatesType) 转换成了 <xsd:choice> 项。现在,显示计划 XML 架构中可能会显示一个或多个 SeekPredicateNew 元素,而不再显示一个或多个 SeekPredicate 元素。这两种元素是相互排斥的。在显示计划 XML 架构中维护 SeekPredicate 的目的在于实现向后兼容;但是,在 SQL Server 2008 中创建的查询计划中也可以包含 SeekPredicateNew 元素。如果不存在 SeekPredicate 元素,则预计从节点 ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple/QueryPlan/RelOp/IndexScan/SeekPredicates 仅检索 SeekPredicate 子元素的应用程序可能会失败。可以重新编写该应用程序,使此节点中包含 SeekPredicateSeekPredicateNew 元素。有关详细信息,请参阅关于已分区表和索引的查询处理增强功能

显示计划 XML 架构

向显示计划 XML 架构的 ObjectType 复杂类型中添加了一个新的 IndexKind 属性。根据 SQL Server 2005 架构严格验证 SQL Server 计划的应用程序将失败。

Transact-SQL

功能

说明

ALTER_AUTHORIZATION_DATABASE DDL 事件

在 SQL Server 2005 中,如果数据定义语言 (DDL) 操作中安全对象的实体类型为对象,则触发 DDL 事件 ALTER_AUTHORIZATION_DATABASE 后,会在 EVENTDATA xml 的 ObjectType 元素中返回值“object”。在 SQL Server 2008 中,则返回实际类型(例如,“table”或“function”)。

CONVERT

如果传递到 CONVERT 函数的样式无效,则会在二进制转换为字符或字符转换为二进制时,返回一个错误。在早期版本的 SQL Server 中,该无效样式会设置为二进制与字符间相互转换时的默认样式。

对程序集 GRANT/DENY/REVOKE EXECUTE

不能对程序集授予、拒绝或撤消“EXECUTE”权限。此权限不起任何作用,并且现在会导致一个错误。可以对引用程序集方法的存储过程或函数授予、拒绝或撤消“EXECUTE”权限。

对系统类型 GRANT/DENY/REVOKE 权限

不能对系统类型授予、拒绝或撤消权限。在早期版本的 SQL Server 中,这些语句会成功,但是不起任何作用。在 SQL Server 2008 中,则会返回错误。

OUTPUT 子句

为了防止出现不确定的行为,当某个列是通过下列方法之一定义时,OUTPUT 子句不能通过视图或内联表值函数引用该列:

  • 子查询。

  • 执行用户数据访问或系统数据访问(或者被认为执行此类访问)的用户定义函数。

  • 在定义中包含执行用户数据访问或系统数据访问的用户定义函数的计算列。

如果 SQL Server 在 OUTPUT 子句中检测到了此类列,将引发错误 4186。有关详细信息,请参阅 MSSQLSERVER_4186

OUTPUT INTO 子句

OUTPUT INTO 子句的目标表不能有任何已启用的触发器。

precompute rank 服务器级选项

SQL Server 2008 不支持此选项。请尽快修改当前使用此功能的应用程序。

READPAST 表提示

当 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON 并且满足以下任一条件时,无法指定 READPAST 表提示:

  • 会话的事务隔离级别为 READ COMMITTED。

  • 查询中也指定了 READCOMMITTED 表提示。

若要在上述情况下指定 READPAST 提示,请删除 READCOMMITTED 表提示(如果存在),然后在查询中包括 READCOMMITTEDLOCK 表提示。

sp_helpuser

在 sp_helpuser 存储过程的结果集中返回的以下列名发生了更改。

以前的列名新列名
GroupNameRoleName
Group_nameRole_name
Group_idRole_id
Users_in_groupUsers_in_role

透明数据加密

在 I/O 级别执行透明数据加密 (TDE):页结构在内存中不加密,而仅在将页写入到磁盘后才对页结构进行加密。数据库文件和日志文件均加密。当数据库使用 TDE 时,那些跳过常规 SQL Server 机制来访问页面(例如,通过直接扫描数据或日志文件)的第三方应用程序将失败,因为文件中的数据已被加密。此类应用程序可以利用 Windows 加密 API 来开发用来在 SQL Server 外部对数据进行解密的解决方案。

XQuery

功能

说明

Datetime 支持

在 SQL Server 2005 中,数据类型 xs:time、xs:date 和 xs:dateTime 不支持时区。时区数据会映射到 UTC 时区。SQL Server 2008 提供了符合标准的行为,从而导致了以下变化:

  • 将验证没有时区的值。

  • 将保留提供的时区或缺少的时区。

  • 修改了内部存储表示形式。

  • 增加了存储值的分辨率。

  • 不允许使用负年份。

可以修改应用程序和 XQuery 表达式来利用新类型值。有关详细信息,请参阅对 time、date、datetime2 和 datetimeoffset 数据类型使用 XML

XQuery 和 Xpath 表达式

在 SQL Server 2005 中,XQuery 或 XPath 表达式中允许使用以冒号(“:”)开头的步骤。例如,下面的语句在路径表达式中包含以冒号开头的名称测试 (CTR02)。

SELECT FileContext.query('for n$ in //CTR return <C>{data )(n$/:CTR02)} </C>) AS Files FROM dbo.MyTable;

在 SQL Server 2008 中,这种用法是不允许的,因为它不符合 XML 标准。返回错误 9341。请删除前导冒号或为名称测试指定一个前缀,例如 (n$/CTR02) 或 (n$/p1:CTR02)。

更改历史记录

更新的内容

添加了对 XQuery 和 Xpath 表达式的重大更改。