Domanda

Finora ho usato ISNULL(dbo.fn_GetPrice(ItemId), 0) per renderlo non annullabile (piuttosto chiamano di valore predefinito, ma qualunque).

E 'questo il modo giusto?

È stato utile?

Soluzione

Sì, questo è il modo giusto per farlo. Utilizzando la funzione isnull si sta creando un'espressione che deve restituire un valore, non importa quale. Questo è valutato da SQL Server ad essere una colonna calcolata che è not null.

Altri suggerimenti

Io preferirei la funzione COALESCE standard ANSI, ma ISNULL va bene. Per usare COALESCE, definire la colonna calcolata come:

COALESCE(dbo.fn_GetPrice(ItemId), 0)

Modifica Imparare qualcosa di nuovo ogni giorno. Ho fatto la seguente:

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

E c2 effetti non è annullabile secondo sp_help, ma c4 viene segnalato come Null, anche se non c'è modo che coagulano espressione potrebbe risultare in un valore nullo.

Inoltre a partire dal 2008, non so se l'opzione esiste, nel 2005, si può persistere una colonna calcolata e aggiungere un vincolo:

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)

si traduce in una violazione del vincolo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top