SQL Server 2014 中数据库引擎功能的行为更改

本主题介绍数据库引擎中的行为更改。 与早期版本的 SQL Server 相比,行为更改会影响功能在 SQL Server 2014 中的工作方式或交互方式。

SQL Server 2014 中的行为更改

在早期版本的 SQL Server 中,对包含特定长度(超过 4020 个字符)的字符串的 XML 文档的查询可能会返回不正确的结果。 在 SQL Server 2014 中,此类查询返回正确的结果。

SQL Server 2012 中的行为更改

元数据发现

从 SQL Server 2012 开始的数据库引擎改进使 SQLDescribeCol 能够获取比 SQL Server 早期版本中 SQLDescribeCol 返回结果更准确的预期结果说明。 有关详细信息,请参阅 元数据发现。

SET FMTONLY在不实际运行查询的情况下确定响应格式的选项将替换为sp_describe_first_result_set(Transact-SQL)、sp_describe_undeclared_parameters(Transact-SQL)、sys.dm_exec_describe_first_result_set(Transact-SQL)和sys.dm_exec_describe_first_result_set_for_object(Transact-SQL)。

对 SQL Server 代理任务编写脚本中行为所做的更改

从 SQL Server 2012 开始,如果通过从现有作业复制脚本创建新作业,则新作业可能会无意中影响现有作业。 若要使用现有作业中的脚本创建新作业,请手动删除参数 @schedule_uid 该参数通常是在现有作业中创建作业计划的节的最后一个参数。 这将为新作业创建新的独立计划,而不会影响现有作业。

CLR User-Defined 函数和方法的常量折叠

从 SQL Server 2012 开始,以下用户定义的 CLR 对象现在可折叠:

  • 确定性标量值的 CLR 用户自定义函数。
  • CLR 用户定义类型的确定性方法。

当这些函数或方法多次调用具有相同参数时,这种改进旨在提高性能。 但是,当非确定性函数或方法被标记为错误确定性时,此更改可能会导致意外结果。 CLR 函数或方法的确定性由IsDeterministic或SqlFunctionAttribute的SqlMethodAttribute属性的值指示。

STEnvelope() 方法的行为已随空空间类型而更改

具有空对象的方法的行为 STEnvelope 现在与其他 SQL Server 空间方法的行为一致。

在 SQL Server 2008 中,该方法 STEnvelope 在调用空对象时返回以下结果:

SELECT geometry::Parse('POINT EMPTY').STEnvelope().ToString()  
-- returns POINT EMPTY  
SELECT geometry::Parse('LINESTRING EMPTY').STEnvelope().ToString()  
-- returns LINESTRING EMPTY  
SELECT geometry::Parse('POLYGON EMPTY').STEnvelope().ToString()  
-- returns POLYGON EMPTY  

在 SQL Server 2012 中,当使用空对象调用时,该方法 STEnvelope 现在返回以下结果:

SELECT geometry::Parse('POINT EMPTY').STEnvelope().ToString()  
-- returns GEOMETRYCOLLECTION EMPTY  
SELECT geometry::Parse('LINESTRING EMPTY').STEnvelope().ToString()  
-- returns GEOMETRYCOLLECTION EMPTY  
SELECT geometry::Parse('POLYGON EMPTY').STEnvelope().ToString()  
-- returns GEOMETRYCOLLECTION EMPTY  

若要确定空间对象是否为空,请调用 STIsEmpty (geometry Data Type) 方法。

LOG 函数具有新的可选参数

该 LOG 函数现在具有可选的 基 参数。 有关详细信息,请参阅 LOG(Transact-SQL)。

分区索引操作期间的统计信息计算已更改

在 SQL Server 2014 中,创建或重新生成分区索引时,不会扫描表中的所有行来创建统计信息。 相反,查询优化器使用默认采样算法来生成统计信息。 使用分区索引升级数据库后,你可能会注意到这些索引的直方图数据存在差异。 这种行为更改可能不会影响查询性能。 若要通过扫描表中所有行的方法获得有关已分区索引的统计信息,请使用 CREATE STATISTICS 或 UPDATE STATISTICS 以及 FULLSCAN 子句。

通过 XML 值方法进行的数据类型转换已发生变化

数据类型value的方法xml的内部行为已更改。 此方法针对 XML 执行 XQuery,并返回指定 SQL Server 数据类型的标量值。 xs 类型必须转换为 SQL Server 数据类型。 以前, value 该方法在内部将源值转换为 xs:string,然后将 xs:string 转换为 SQL Server 数据类型。 在 SQL Server 2014 中,在以下情况下跳过到 xs:string 的转换:

源 XS 数据类型 目标 SQL Server 数据类型
字节

短

整数 (int)

整数

长整型

无符号字节

无符号短整型

无符号整数

无符号长整数

positiveInteger

非正整数

负整数

非负整数
tinyint

smallint

整数 (int)

bigint

十进制

数字
十进制 十进制

数字
float 真实
翻倍 float

当可以跳过中间转换时,新行为可提高性能。 但是,当数据类型转换失败时,你会看到与从中间 xs:string 值转换时引发的错误消息不同。 例如,如果 value 方法未能将 int 值 100000 转换为 a smallint,则前面的错误消息为:

The conversion of the nvarchar value '100000' overflowed an INT2 column. Use a larger integer column.

在 SQL Server 2014 中,如果没有中间转换为 xs:string,错误消息为:

Arithmetic overflow error converting expression to data type smallint.

XML 模式下的 sqlcmd.exe 行为更改

如果在从 T FOR XML 执行 SELECT * 时将 sqlcmd.exe 与 XML 模式 (:XML ON 命令)配合使用,则存在行为更改...

DBCC CHECKIDENT 修订消息

在 SQL Server 2012 中,仅当 DBCC CHECKIDENT 命令返回的消息与 RESEED 一起使用 new_reseed_value以 更改当前标识值时才会更改。 新消息是“检查身份信息:当前身份值'<当前身份值>'”。 DBCC 执行完毕。 如果 DBCC 打印了错误消息,请与系统管理员联系。

在早期版本中,消息为“检查标识信息:当前标识值'<当前标识值>',当前列值'<当前列值>'。DBCC 执行已完成。如果 DBCC 打印了错误消息,请与系统管理员联系。” 当指定DBCC CHECKIDENT与NORESEED时,没有第二个参数或没有重排值,消息保持不变。 有关详细信息,请参阅 DBCC CHECKIDENT (Transact-SQL)。

XML 数据类型上的 exist() 函数的行为已更改

XML 数据类型与 null 值比较为 0(零)时,exist() 函数的行为已发生变化。 请看下面的示例:

DECLARE @test XML;  
SET @test = null;  
SELECT COUNT(1) WHERE @test.exist('/dogs') = 0;  

在早期版本中,此比较返回 1(true):现在,此比较返回 0(零,false)。

以下比较未更改:

DECLARE @test XML;  
SET @test = null;  
SELECT COUNT(1) WHERE @test.exist('/dogs') = 1; -- 0 expected, 0 returned  
SELECT COUNT(1) WHERE @test.exist('/dogs') IS NULL; -- 1 expected, 1 returned  

另请参阅

SQL Server 2014 中数据库引擎功能的重大更改
SQL Server 2014 中不推荐使用的数据库引擎功能
SQL Server 2014 中停止使用的数据库引擎功能
ALTER DATABASE 兼容性级别 (Transact-SQL)