如何使计算列不可为空?

时间:2009-12-21 04:14:23

标签: sql-server-2005 default-value calculated-columns non-nullable

到目前为止,我一直在使用ISNULL(dbo.fn_GetPrice(ItemId), 0)使其不可为空(而是将其称为默认值,但无论如何)。

这是正确的方法吗?

2 个答案:

答案 0 :(得分:3)

是的,这是正确的方法。通过使用isnull函数,您将创建一个必须返回值的表达式,无论如何。 SQL Server将其评估为not null的计算列。

答案 1 :(得分:2)

我更喜欢ANSI标准COALESCE功能,但ISNULL很好。要使用COALESCE,请将计算列定义为:

COALESCE(dbo.fn_GetPrice(ItemId), 0)

编辑每天都在学习新知识。我做了以下事情:

create table t (c1 int null
    , c2 as isnull(c1, 1) 
    , c3 as isnull(c1, null)
    , c4 as coalesce(c1, 1)
    , c5 as coalesce(c1, null)
    )

exec sp_help t

根据sp_help,c2确实不可为空,但c4被报告为可为空,即使合并表达式无法导致空值。

同样截至2008年,我不知道该选项是否存在于2005年,可以保留计算列并添加约束:

create table t (c1 int null
    , c2 as isnull(c1, 1) persisted not null
    , c3 as isnull(c1, null) persisted not null
    , c4 as coalesce(c1, 1) persisted not null
    , c5 as coalesce(c1, null) persisted not null
    )
go
insert into t (c1) values (null)

导致违反约束。