6

我有一个带有非空“数量”(十进制)和“状态”(int)列的产品表,并且我使用以下案例表达式在该表上创建了一个视图:

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 提供默认值并强制不可为空,但没有有意义的默认值,据我了解,这首先不应该发生。有什么想法吗?

4

1 回答 1

7

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

数据库引擎根据使用的表达式自动确定计算列的可空性。即使只有不可为空的列存在,大多数表达式的结果也被认为是可空的,因为可能的下溢或溢出也会产生空结果。使用具有 AllowsNull 属性的 COLUMNPROPERTY 函数来调查表中任何计算列的可空性。可以通过指定 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
于 2011-05-17T17:00:34.423 回答