我有一个带有非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在这种情况下提供默认值并强制不可为空,但是没有有意义的默认值,这应该不是我理解的第一个地方。有什么想法正在发生什么?
答案 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