2011-05-17 34 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