本主题介绍数据库引擎中的行为更改。 与早期版本的 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 函数或方法的确定性由SqlFunctionAttribute
或SqlMethodAttribute
的IsDeterministic
属性的值指示。
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 值方法进行的数据类型转换已发生变化
数据类型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 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)