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

时间:2011-05-17 16:56:54

标签: sql dbnull sql-view

我有一个带有非null“quantity”(十进制)和“status”(int)列的Product表,我在这个表上创建了一个带有以下case表达式的视图:

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

ProductTypeId被正确推断为非null。但是,即使基础列不可为空,也会将此视图的“数量”列推断为可为空。这对我没有任何意义。

我可以使用ISNULL / COALESCE在这种情况下提供默认值并强制不可为空,但是没有有意义的默认值,这应该不是我理解的第一个地方。有什么想法正在发生什么?

1 个答案:

答案 0 :(得分:7)

以下说明适用于表格中的computed columns。我想这同样适用于视图中的计算列。

  

数据库引擎自动   确定计算的可空性   基于所用表达式的列。   大多数表达的结果是   即使只是被认为是可以为空的   存在不可存在的列,   因为可能的下溢或   溢出将产生null结果   好。使用COLUMNPROPERTY功能   使用AllowNull属性   调查任何可行性的可空性   表中的计算列。一个   可以为空的表达式可以   变成了一个不可侵犯的人   指定ISNULL(check_expression,   常数),常数是a   nonnull值替换任何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