SQL视图从非空表推断可为空列?

6

我有一个Product表,其中包含非空的“quantity”(十进制)和“status”(整数)列,并且我在此表上创建了一个视图,其中包含以下情况表达式:

SELECT P.ProductTypeId,
       (CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity,
       ...
FROM Product P

ProductTypeId被正确地推断为非空。然而,这个视图的Quantity列被推断为可空,尽管底层列不可空。我觉得这毫无意义。

我可以使用ISNULL/COALESCE在这种情况下提供默认值并强制非空性,但是在这种情况下没有有意义的默认值,而且从我的理解来看,这本应该不会发生。有什么想法吗?


可能是重复的问题:如何使视图列非空 - Ian Kemp
1个回答

7
下面的解释是关于表中计算列的。我想同样适用于视图中的计算列。
数据库引擎根据所使用的表达式自动确定计算列的可空性。大多数表达式的结果即使只有非空列存在也被认为是可空的,因为可能的下溢或上溢也会产生空结果。使用COLUMNPROPERTY函数和AllowsNull属性来调查表中任何计算列的可空性。一个可空的表达式可以通过指定ISNULL(check_expression, constant)来转换为非空表达式,其中constant是替换任何null结果的非null值。
一个例子,你的表达式可能返回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

有没有办法指定这种溢出情况是不可能的? - naasking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接