SQL Server 2014 中数据库引擎功能的行为更改
本主题介绍数据库引擎中的行为更改。 与早期版本的 SQL Server 相比,行为更改会影响 SQL Server 2014 中功能的工作方式或交互方式。
SQL Server 2014 中的行为更改
在早期版本的 SQL Server 中,对包含特定长度 (超过 4020 个字符的字符串的 XML 文档进行查询) 可能会返回不正确的结果。 在 2014 SQL Server中,此类查询返回正确的结果。
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 用户定义函数和方法的常量折叠
从 SQL Server 2012 开始,以下用户定义的 CLR 对象现在可折叠:
- 确定性的标量值 CLR 用户定义函数。
- 确定性的 CLR 用户定义类型的方法。
此改进旨在增强当使用相同的参数多次调用这些函数或方法时的性能。 但是,此更改可能会在非确定性函数或方法被错误标记为确定性函数或方法时导致意外结果。 CLR 函数或方法的确定性由 IsDeterministic
或 SqlFunctionAttribute
的 SqlMethodAttribute
属性的值指示。
具有空的空间类型的 STEnvelope() 方法的行为已更改
具有空对象的 方法的行为STEnvelope
现在与其他SQL Server空间方法的行为一致。
在 2008 SQL Server中,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 执行 XQuery,并返回指定SQL Server数据类型的标量值。 xs 类型必须转换为SQL Server数据类型。 以前, value
方法在内部将源值转换为 xs:string,然后将 xs:string 转换为SQL Server数据类型。 在 SQL Server 2014 中,在以下情况下跳过到 xs:string 的转换:
源 XS 数据类型 | 目标 SQL Server 数据类型 |
---|---|
字节 short int integer long unsignedByte unsignedShort unsignedInt unsignedLong positiveInteger nonPositiveInteger negativeInteger nonNegativeInteger |
tinyint smallint int bigint Decimal numeric |
decimal | decimal numeric |
FLOAT | real |
Double | FLOAT |
新行为改进了可跳过中间转换时的性能。 但是,当数据类型转换失败时,您看到的错误消息将有别于从中间 xs:string 值进行转换时引发的错误消息。 例如,如果 value 方法未能将 int
值 100000 转换为 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() 函数的行为已更改
将具有 null 值的 XML 数据类型与 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 Compatibility Level (Transact-SQL)