1

Jusqu'à présent, j'ai utilisé ISNULL(dbo.fn_GetPrice(ItemId), 0) pour le rendre non-nul (plutôt l'appeler par défaut, mais peu importe).Comment rendre la colonne calculée non nulle?

Est-ce la bonne façon?

+0

Quel dialecte SQL utilisez-vous? – kiamlaluno

+0

Vous devez clarifier le langage, le dialecte SQL, la version de la base de données, etc. – harschware

+0

Microsoft SQL Server – Shimmy

Répondre

3

Oui, c'est la bonne façon de le faire. En utilisant la fonction isnull, vous créez une expression qui doit renvoyer une valeur, quoi qu'il arrive. Cela est évalué par SQL Server comme une colonne calculée not null.

2

Je préférerais la fonction ANSI standard 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 En savoir quelque chose de nouveau tous les jours. 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 annulable, même si il n'y a aucun moyen coalescent expression pourrait se traduire par une valeur nulle.

également à partir de 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.

+1

Woops! Je découvre juste que cela ne provoque pas la non-nullité de la colonne calculée, puisque COALESCE pourrait aussi être COALESCE (NULL, NULL), c'est-à-dire aucune garantie pour un résultat non nul, je suppose que ISNULL est la seule option. Je suis tellement désolé de vous déranger, je viens de le découvrir, j'ai déjà changé quelques endroits dans la DB cuz de celui-ci ... – Shimmy

Questions connexes