SQL-представление выводит обнуляемый столбец из ненулевой таблицы? - PullRequest
6 голосов
/ 17 мая 2011

У меня есть таблица 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 Ответ

7 голосов
/ 17 мая 2011

Ниже приведено объяснение для вычисляемых столбцов в таблице. Я полагаю, что то же самое относится и к вычисляемым столбцам в представлении.

Database Engine автоматически определяет обнуляемость вычисляемых столбцы на основе используемых выражений. Результатом большинства выражений является считается обнуляемым, даже если только присутствуют необнуляемые столбцы, потому что возможные потери или переполнение даст нулевые результаты как Что ж. Используйте функцию COLUMNPROPERTY со свойством AllowsNull для исследовать обнуляемость любого вычисляемый столбец в таблице. выражение, которое можно обнулять, может быть превратился в ненулевой указав ISNULL (check_expression, постоянная), где постоянная ненулевое значение, заменяемое любым нулем результат.

Примером, где ваше выражение может вернуть 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
...