SQL Server 2012 中数据库引擎功能的行为更改
本主题介绍数据库引擎中的行为更改。 与早期版本的 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 函数或方法的确定性由 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 数据类型) 方法。
LOG 函数具有新的可选参数
LOG 函数现在具有可选 base 参数。 有关详细信息,请参阅 LOG (Transact-SQL)。
已分区索引操作期间的统计信息计算已更改
在 SQL Server 2012 中,当创建或重新生成已分区索引时,并非通过扫描表中的所有行来创建统计信息。 相反,查询优化器使用默认采样算法来生成统计信息。 在升级具有已分区索引的数据库后,您可以在直方图数据中注意到针对这些索引的差异。 此行为更改可能不会影响查询性能。 若要通过扫描表中所有行的方法获得有关已分区索引的统计信息,请使用 CREATE STATISTICS 或 UPDATE STATISTICS 以及 FULLSCAN 子句。
通过 XML value 方法进行的数据类型转换已更改
xml 数据类型的 value 方法的内部行为已更改。 此方法对 XML 执行 XQuery,并返回指定的 SQL Server 数据类型的标量值。 xs 类型必须转换为 SQL Server 数据类型。 以前,value 方法在内部将源值转换为 xs:string,然后将 xs:string 转换为 SQL Server 数据类型。 在 SQL Server 2012 中,以下情况下将跳过到 xs:string 的转换:
源 XS 数据类型 |
目标 SQL Server 数据类型 |
---|---|
byte 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 2012 中,如果没有到 xs:string 的中间转换,则错误消息为:
Arithmetic overflow error converting expression to data type smallint.
XML 模式中的 sqlcmd.exe 行为更改
如果在执行 SELECT * from T FOR XML … 时通过 XML 模式(:XML ON 命令)使用 sqlcmd.exe,则会出现行为更改。 有关详细信息,请参阅易管理性增强功能(数据库引擎)。
DBCC CHECKIDENT 修改了消息
在 SQL Server 2012 中,DBCC CHECKIDENT 命令返回的消息仅在其与 RESEED new_reseed_value 一起用来更改当前标识值时发生更改。 新消息为“正在检查标识信息: 当前标识值为‘<当前标识值>’。 DBCC 执行完毕。 如果 DBCC 输出了错误消息,请与系统管理员联系。”
在早期版本中,该消息为“检查标识信息: 当前标识值‘<当前标识值>’,当前列值‘<当前列值>’。 DBCC 执行完毕。 如果 DBCC 输出了错误消息,请与系统管理员联系。”在使用 NORESEED 指定 DBCC CHECKIDENT 时(没有第二个参数或没有重设种子值),该消息保持不变。 有关详细信息,请参阅 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