Как сделать вычисляемый столбец не обнуляемым?
До сих пор я использовал ISNULL(dbo.fn_GetPrice(ItemId), 0)
чтобы сделать его не обнуляемым (лучше называть его значением по умолчанию, но как угодно).
Это правильный путь?
2 ответа
Да, это правильный способ сделать это. Используя 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 действительно не обнуляется в соответствии с sp_help, но 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)
приводит к нарушению ограничения.