Question

J'ai une table de produit avec des colonnes "Quantité" (décimal) et "status" (int), et j'ai créé une vue sur ce tableau avec l'expression de cas suivante:

SELECT P.ProductTypeId,
       (CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity,
       ...
FROM Product P

ProductTypeid est correctement déduit comme non nul. Cependant, la colonne de quantité de cette vue est déduite comme nullable, même si les colonnes sous-jacentes ne sont pas nullables. Cela n'a aucun sens pour moi.

Je pourrais utiliser ISNULL / COMESCE pour fournir une valeur par défaut dans ce cas et forcer la non-nullabilité, mais il n'y a pas de valeur par défaut significative, et cela ne devrait pas se produire en premier lieu à partir de ce que je comprends. Avez-vous une idée de ce qui passe?

Était-ce utile?

La solution

L'explication ci-dessous est pour colonnes calculées dans une table. J'imagine que la même chose s'applique aux colonnes calculées dans une vue.

Le moteur de la base de données détermine automatiquement l'annonce des colonnes calculées en fonction des expressions utilisées. Le résultat de la plupart des expressions est considéré comme nullable même si seules des colonnes non nullables sont présentes, car des sous-écoulements ou débordements possibles produiront également des résultats nuls. Utilisez la fonction ColumnProperty avec la propriété PertiveNull pour étudier la nullabilité de toute colonne calculée dans un tableau. Une expression nullable peut être transformée en une expression non nul en spécifiant ISNULL (Check_Expression, constante), où la constante est une valeur non nul substituée à tout résultat nul.

Un exemple où votre expression pourrait revenir NULL est

SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;

WITH Product(Quantity,StatusId) As
(
SELECT -2147483648,1
)
SELECT (CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity  
FROM Product P
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top