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 函数或方法的确定性由SqlFunctionAttributeSqlMethodAttributeIsDeterministic属性的值指示。

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 STATISTICSUPDATE STATISTICS 以及 FULLSCAN 子句。

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

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

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



整数 (int)

整数

长整型

无符号字节

无符号短整型

无符号整数

无符号长整数

positiveInteger

非正整数

负整数

非负整数
tinyint

smallint

整数 (int)

bigint

十进制

数字
十进制 十进制

数字
漂浮 真实
翻倍 漂浮

当可以跳过中间转换时,新行为可提高性能。 但是,当数据类型转换失败时,你会看到与从中间 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 CHECKIDENTNORESEED时,没有第二个参数或没有重排值,消息保持不变。 有关详细信息,请参阅 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)