Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

Я бы предпочел стандартную функцию 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

И c2 действительно не допускает значения NULL согласно sp_help, но c4 сообщается как допускающее значение NULL, даже несмотря на то, что выражение объединения не может привести к нулевому значению.

Кроме того, по состоянию на 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)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top