Как сделать вычисляемый столбец не обнуляемым? - PullRequest
1 голос
/ 21 декабря 2009

До сих пор я использовал ISNULL(dbo.fn_GetPrice(ItemId), 0), чтобы сделать его необнуляемым (лучше назвать его значением по умолчанию, но как угодно).

Это правильный путь?

Ответы [ 2 ]

3 голосов
/ 21 декабря 2009

Да, это правильный способ сделать это. Используя функцию isnull, вы создаете выражение, которое должно возвращать значение, несмотря ни на что. SQL Server оценивает его как вычисляемый столбец not null.

2 голосов
/ 22 декабря 2009

Я бы предпочел стандартную функцию COALESCE ANSI, но 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 считается обнуляемым, хотя нет никакого способа, которым выражение coalesce может привести к нулевому значению.

Также с 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)

приводит к нарушению ограничения.

...