SQL-представление выводит обнуляемый столбец из ненулевой таблицы?
У меня есть таблица Product с ненулевыми столбцами "количество" (десятичный) и "статус" (int), и я создал представление для этой таблицы со следующим выражением регистра:
SELECT P.ProductTypeId,
(CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity,
...
FROM Product P
ProductTypeId правильно выводится как ненулевой. Тем не менее, столбец Количество этого представления выводится как обнуляемый, даже если нижележащие столбцы не обнуляются. Это не имеет никакого смысла для меня.
Я мог бы использовать ISNULL/COALESCE, чтобы предоставить значение по умолчанию в этом случае и принудительно установить ненулевое значение, но не существует значимого значения по умолчанию, и это не должно происходить в первую очередь из того, что я понимаю. Есть идеи, что происходит?
1 ответ
Ниже приведено объяснение для вычисляемых столбцов в таблице. Я предполагаю, что то же самое относится к вычисляемым столбцам в представлении.
Компонент Database Engine автоматически определяет обнуляемость вычисляемых столбцов на основе используемых выражений. Результат большинства выражений считается обнуляемым, даже если присутствуют только ненулевые столбцы, поскольку возможные недопустимые значения или переполнения также приведут к нулевым результатам. Используйте функцию COLUMNPROPERTY со свойством AllowsNull, чтобы исследовать обнуляемость любого вычисляемого столбца в таблице. Выражение со значением NULL можно превратить в ненулевое значение, указав ISNULL(check_expression, constant), где константа - ненулевое значение, заменяющее любой нулевой результат.
Пример, где ваше выражение может вернуться NULL
является
SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
WITH Product(Quantity,StatusId) As
(
SELECT -2147483648,1
)
SELECT (CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity
FROM Product P