2010-08-04 7 views
2

Je veux modifier une vue comme suit:Comment appliquer NOT NULL dans la colonne calculée d'une vue

ALTER VIEW [dbo].[ViewOne] as 
SELECT columnOne, -- not null 
     columnTwo, --not null 
     (convert(decimal(2,0), columnOne)) as columnThree -- I want this not to be NULL 
FROM DBOne.TableOne 

Depuis columnOne est « non nulle » Je veux forcer columnThree à être « non nulle » aussi. Est possible, impossible, implicite, inutile ou pourrait causer des problèmes sérieux puisque columnOne est rempli avec des algarisms seulement (2).

Je voudrais simplement connaître la syntaxe

Répondre

4

Toutefois, cela ne signifie pas que vous ne recevrez pas d'exception si ColumnOne ne peut pas être converti en decimal(2,0) et que vous ne saurez pas si vous obtiendrez une exception tant que vous n'aurez pas lancé d'interrogation sur la vue. Vous devriez envisager d'ajouter un contrôle supplémentaire pour déterminer si la distribution échouera et aider à atténuer la possibilité d'une erreur de casting:

Alter View dbo.ViewOne 
As 
Select ColumnOne, ColumnTwo 
    , Case 
     When IsNumeric(ColumnOne) = 0 Then 0 
     Else Cast(ColumnOne As decimal(2,0)) 
     End As ColumnThree 
4

Vous pouvez utiliser ISNULL() pour assurer une valeur par défaut lorsque nulle.

ALTER VIEW [dbo].[ViewOne] as 
SELECT columnOne, -- not null 
     columnTwo, --not null 
     ISNULL((convert(decimal(2,0), columnOne)),0.00) as columnThree 
FROM DBOne.TableOne 
4

Si colonne1 est contrainte d'être NOT NULL, alors colonne3 ne peut pas être NULL, donc il n'y a pas besoin de se soucier.

+0

pourrait pas être nul si la conversion en décimal échoue? – Fosco

+0

Une conversion échouée est une exception, l'instruction sera terminée. – Rabid

+0

@Fosco - Non. Vous obtiendrez une erreur si la conversion échoue. En supposant que la conversion réussisse, si la source est connue (c'est-à-dire non nulle), alors la sortie sera connue. – Thomas

0

La façon dont vous l'appliquez dépend de vos règles métier.

Voulez-vous que ces lignes n'apparaissent pas dans les résultats de la vue? Ajoutez ensuite ces critères à la clause WHERE de vue.

Voulez-vous utiliser une valeur par défaut si la colonne est NULL? Utilisez ensuite COALESCE pour renvoyer votre valeur par défaut pour NULLs (n'oubliez pas d'aliaser la colonne).

Voulez-vous une erreur renvoyée si une ligne est insérée dans la table sous-jacente (s) qui provoquerait une telle chose? Dans ce cas, je mettrais la contrainte sur la (les) table (s) sous-jacente (s). Si votre vue inclut des JOINs et des agrégats, cela peut être difficile, mais sans un exemple précis, je ne peux pas vraiment vous aider.

Dans tous les cas, pour votre exemple spécifique, vous ne devriez pas voir de valeurs NULL car columnOne n'est pas NULL. ColumnThree ne sera jamais nul si la source de la distribution n'est elle-même jamais nulle.

Questions connexes