在SQL Server Management Studio中标记持久计算列NOT NULL

时间:2010-01-12 15:22:38

标签: sql-server ssms

在SQL Server 2005中可以创建一个既持久又被定义为NOT NULL的计算列(不能包含空值)。第二个属性在使用像Linq2Sql这样的库时很重要,如果我们想避免大量的手工工作来确保我们的代码“始终”列有值。

使用直接SQL这很简单:
ALTER TABLE Sales ADD Total AS (Price + Taxes) PERSISTED NOT NULL

在SQL Server Management Studio的设计窗口中查看时,此列正确显示为计算列,没有“允许空值”的复选标记。但是,我遇到了在设计器中创建新列以匹配此模式的问题:在计算列规范中输入公式 - > (公式)属性,通过将Is Persisted设置为Yes来指定持久属性,但尝试取消选中新计算列上的'allow nulls'会产生一个对话框,指出“无法修改属性”。

我需要涵盖广泛的技能水平,为此我需要提供添加列的程序,即使是新手也可以遵循(这意味着Management Studio设计器窗口)。在SQL Server Management Studio中是否有一些秘密用于在设计器中创建一个新的计算列为NOT NULL,类似于如何使用CTRL + 0将空值插入到单元格中?

4 个答案:

答案 0 :(得分:18)

您可以使用ISNULL(Price + Taxes, 0)作弊,它使用默认值0进行NULL计算。

答案 1 :(得分:10)

如Scoregraphic所述,您可以使用ISNULL执行此操作。

我经常将此用于计算标记,例如,在User表中,我有一个DeletedDate来知道帐户何时被删除。然后我创建一个名为IsDeleted(类型位)的计算非可空布尔列,如下所示:

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

需要注意的重要一点是,ISNULL必须位于表达式的最外层,以便设计人员意识到它是一个不可为空的计算列。

答案 2 :(得分:2)

我尝试了这个并查看左侧的树视图,它确实将列设置为非空,即使在右窗格设计器中未选中复选框...

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

答案 3 :(得分:1)

根据this article,nullability是由sqlserver根据计算表达式的可能值确定的。由于PriceTaxes可能是可空的,因此无法确定其总和是否为空。

然而,正如@Richard建议的那样,使用ISNULL方法避免了这种情况。然而,据我所知,无需声明专栏NOT NULL