1

到目前为止,我一直在使用ISNULL(dbo.fn_GetPrice(ItemId), 0)使其不能为空(相当于将其称为默认值,但无论如何)。如何使计算列不可为空?

这是正确的方式?

+0

您使用哪种SQL方言? – kiamlaluno 2009-12-21 04:18:02

+0

您应该澄清语言,SQL方言,数据库版本等 – harschware 2009-12-21 04:18:33

+0

Microsoft SQL服务器 – Shimmy 2009-12-21 04:23:13

回答

3

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

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 

和C2确实不为空的根据则sp_help,但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) 

导致违反约束。

+1

Woops! 我只是发现它不会导致计算列是不可空的,因为COALESCE也可以是COALESCE(NULL,NULL),即不保证非空结果,我猜ISNULL是唯一的选择。 我很抱歉打扰你,我刚刚发现它,我已经改变了数据库中的几个位置。 – Shimmy 2009-12-21 23:54:41