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

Était-ce utile?

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.

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