2011-05-17 85 views
5

我有非空的“量”(十进制)和“状态”(int)的列的产品表,我创建有关此表的视图与下列情况下的表达式:SQL视图推断非空表中的可空列吗?

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

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

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

回答

6

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

数据库引擎自动 确定基于所使用的表达式计算 列的空性。 大多数表达式的结果 认为可空哪怕只有 非空列都存在,因为 可能下溢或溢出 会产生无效的结果 好。使用带AllowsNull属性的COLUMNPROPERTY函数 到 调查表中任何 计算列的可空性。一个 表达式可为空可以是 变成非空一个由 指定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 
+0

而且也没有办法来指定,这种溢出情况下是不可能的? – naasking 2011-05-17 17:36:37