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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top