有关differences between compatibility level 80 and level 90的MS文档说的是兼容性级别80:
浮点数据类型上算术运算符的可为空性始终为空
并针对90级:
对于输入为非空且ANSI_WARNINGS或ARITHABORT为ON的情况,算术运算符在浮点数据类型上的可为空属性将更改为不可为空。
我不明白。您能帮忙吗,谢谢!
答案 0 :(得分:2)
在兼容级别80和90中,默认情况下,将浮点数据类型上的算术表达式的结果视为可为空。
在兼容级别90中-仅当且仅当算术表达式的输入为不可空值且设置了ANSI_WARNINGS
或ARITHABORT
中的至少一个时,该结果才被认为是不可空的到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;