Comment appliquer NOT NULL dans la colonne calculée de vue
-
25-09-2019 - |
Question
Je veux modifier une vue comme suit:
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-il possible, impossible, implicite, inutile ou pourrait causer des problèmes graves puisque columnOne est char (2) peuplé de algarisms seulement.
Je voudrais simplement connaître la syntaxe
La solution
ColumnThree ne sera jamais nulle si la source de Cast est lui-même jamais nulle. Toutefois, cela ne signifie pas que vous n'obtiendrez une exception si ColumnOne ne peut pas être jeté à decimal(2,0)
et vous ne saurez pas si vous obtiendrez une exception jusqu'à ce que vous interrogez 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 distribution d'erreur:
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
Autres conseils
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
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.
Comment vous appliquez cela dépend de vos règles métier.
Voulez-vous ces lignes pour ne pas afficher dans les résultats de vue? Puis ajouter que les critères à la vue clause WHERE.
Voulez-vous utiliser une valeur par défaut si la colonne serait NULL? Utilisez ensuite COALESCE pour retourner votre valeur par défaut pour les valeurs NULL (rappelez-vous juste un alias de la colonne).
Voulez-vous une erreur renvoyée si une ligne est insérée dans la table sous-jacente (s) qui causerait une telle chose? Dans ce cas, je mettrais la contrainte sur la table sous-jacente (s). Si votre point de vue et comprend JOIN agrégats alors que peut être difficile, mais sans un exemple précis, je ne peux vraiment aider à ce sujet.
Dans tous les cas, pour votre exemple spécifique que vous ne devriez pas voir toutes les valeurs NULL depuis columnOne est NOT NULL.