Comment faire colonne calculée non Nullable?
-
20-09-2019 - |
Question
Jusqu'à présent, je me sers de ISNULL(dbo.fn_GetPrice(ItemId), 0)
pour le rendre non annulable (appel plutôt par défaut à valeur, mais peu importe).
Est-ce la bonne façon?
La solution
Oui, c'est la bonne façon de le faire. En utilisant la fonction isnull
vous créez une expression qui doit retourner une valeur, peu importe quoi. Ceci est évalué par SQL Server pour être une colonne calculée qui est not null
.
Autres conseils
Je préfère la fonction standard ANSI COALESCE, mais ISNULL est très bien. Pour utiliser COALESCE, définir votre colonne calculée comme suit:
COALESCE(dbo.fn_GetPrice(ItemId), 0)
EDIT Apprendre quelque chose de nouveau chaque jour. Je l'ai fait ce qui suit:
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
Et c2 est en effet pas annulable selon sp_help, mais c4 est signalé comme étant annulable, même si il n'y a aucun moyen coalescent expression pourrait se traduire par une valeur nulle.
De plus en 2008, je ne sais pas si l'option existe en 2005, on peut persister une colonne calculée et ajouter une contrainte:
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)
résulte en une violation de contrainte.