到目前为止,我一直在使用ISNULL(dbo.fn_GetPrice(ItemId), 0)
使其不可为空(而是将其称为默认值,但无论如何)。
这是正确的方法吗?
答案 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)
导致违反约束。