2010-01-12 89 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必须在表达的最外层部分的认识到它的设计师是一个不可计算的计算列。