SQL Server中浮点数据类型上算术运算符的可空性属性

时间:2019-06-10 11:33:41

标签: sql-server sql-server-2008-r2

有关differences between compatibility level 80 and level 90的MS文档说的是兼容性级别80:

  

浮点数据类型上算术运算符的可为空性始终为空

并针对90级:

  

对于输入为非空且ANSI_WARNINGS或ARITHABORT为ON的情况,算术运算符在浮点数据类型上的可为空属性将更改为不可为空。

我不明白。您能帮忙吗,谢谢!

1 个答案:

答案 0 :(得分:2)

在兼容级别80和90中,默认情况下,将浮点数据类型上的算术表达式的结果视为可为空。

在兼容级别90中-仅当且仅当算术表达式的输入为不可空值且设置了ANSI_WARNINGSARITHABORT中的至少一个时,该结果才被认为是不可空的到ON

请考虑以下情形:

declare @t as table
(
    f1 float not null,
    f2 float null
);

insert into @t (f1, f2) values (0.1, 1.0);

在两个兼容级别中,以下表达式将被视为可为空:

select f1 * f2
from @t;

而以下表达式在兼容级别80中将被视为可为空,而在兼容级别90中将为不可为空:

-- in compatibility level 90 (or higher),
-- setting ansi_warnings to on implicitly sets arithabort to on.
SET ANSI_WARNINGS ON; 

select f1 * f1 -- note: both inputs are non-nullable!
from @t;
相关问题