2010-01-12 91 views
14

SQL Server 2005中可能會創建一個既持久又計算爲NOT NULL(不能包含空值)的計算列。當使用Linq2Sql這樣的庫時,如果我們想要避免大量的手工工作來保證我們的代碼「always」有一個值,那麼第二個屬性是非常重要的。在SQL Server Management Studio中標記持久計算列NOT NULL

有了直接的SQL,這是非常簡單的:
ALTER TABLE Sales ADD Total AS (Price + Taxes) PERSISTED NOT NULL

當SQL Server Management Studio中的設計窗口中查看此列正確圖示爲不帶複選標記計算列的「允許空值」。然而,我遇到了一個問題,在設計器中創建新列以匹配此模式:公式輸入到計算列指定 - >(公式)屬性中,通過將Is Persisted設置爲Yes指定持久屬性,但嘗試取消選中在一個新的計算列上允許「空值」會導致一個對話框,指出「屬性不能被修改」。

我需要覆蓋廣泛的技能水平,爲此我需要提供添加列的步驟,即使是新手也可以遵循(這意味着Management Studio設計器窗口)。 SQL Server Management Studio中是否存在一些祕密,用於在設計器中創建一個新的計算列作爲NOT NULL,類似於說明如何使用CTRL + 0將空值插入到單元格中?

回答

16

您可能使用ISNULL(Price + Taxes, 0)作爲NULL計算的默認值0。

0

我嘗試這樣做,看着屏幕上確實設置列了爲NOT NULL,即使在右窗格中設計師的複選框未選中左邊的樹形...

ALTER TABLE Sales ADD Total AS ISNULL(isnull(Price,0) + isnull(Taxes,0),0) PERSISTED NOT NULL 
1

根據this article根據計算表達式的可能值,sqlserver決定可空性。由於PriceTaxes可能爲空,因此無法確定它們的總和是否爲空。

但是,正如@Richard所建議的那樣,使用ISNULL方法可以避免這種情況。據我所知,宣佈列NOT NULL應該不是必需的。

+0

我處於同樣的情況,但'價格'和'稅收'均不可空。 – xr280xr 2017-11-09 23:52:56

10

作爲Scoregraphic筆記,您可以使用ISNULL做到這一點。

我經常用這個計算的標誌,例如,在User表,我有一個DeletedDate知道什麼時候該帳戶已被刪除。然後我創建一個名爲IsDeleted(類型位)這樣的計算非可空布爾列:

isnull(case when DeletedDate is null then 0 else 1 end, 0) 

需要注意的重要一點是,ISNULL必須在表達的最外層部分的認識到它的設計師是一個不可計算的計算列。