Свойство обнуляемости арифметических операторов над типом данных с плавающей запятой в SQL Server - PullRequest
0 голосов
/ 10 июня 2019

Документация MS о различиях между уровнем совместимости 80 и уровнем 90 говорит об уровне совместимости 80:

Свойство обнуляемости арифметических операторов над типом данных с плавающей запятой всегда можно обнулять

и для уровня 90:

Свойство обнуляемости арифметических операторов над типом данных с плавающей запятой изменяется на необнуляемое для случая, когда входные данные не обнуляются и для ANSI_WARNINGS или ARITHABORT установлено значение ON.

Я не понимаю этого. Не могли бы вы помочь, спасибо!

1 Ответ

2 голосов
/ 11 июня 2019

На обоих уровнях совместимости 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...