Как сделать вычисляемый столбец не обнуляемым?
-
20-09-2019 - |
Вопрос
До сих пор я использовал 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)
приводит к нарушению ограничений.