2011-05-17 10 views
5

Tengo una tabla del producto con no nulo "cantidad" (decimal) y (int) columnas "status", y crea una vista en esta tabla con la siguiente expresión case:¿La vista SQL infiere la columna anulable de la tabla no nula?

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

ProductTypeId es correcta inferido como no nulo. Sin embargo, la columna Cantidad de esta vista se deduce como anulable, aunque las columnas subyacentes no sean nulables. Esto no tiene ningún sentido para mí.

Podría usar ISNULL/COALESCE para proporcionar un valor predeterminado en este caso y forzar la no anulabilidad, pero no hay un valor predeterminado significativo, y esto no debería ocurrir en primer lugar por lo que entiendo. ¿Alguna idea de qué está pasando?

Respuesta

6

La explicación siguiente es para computed columns en una tabla. Imagino lo mismo se aplica a las columnas calculadas en una vista.

El motor de base de datos de forma automática determina la anulabilidad del calculadas columnas basadas en las expresiones utilizadas. El resultado de la mayoría de las expresiones se considera anulable incluso si sólo columnas nonnullable están presentes, debido a posibles subdesbordamiento o desbordamiento de producirán resultados nulos como también. Utilice la función COLUMNPROPERTY con la propiedad AllowsNull para investigar la nulabilidad de cualquier columna calculada en una tabla. Un expresión que es anulable puede ser convirtió en un uno nonnullable por especificando ISNULL (check_expression, constante), en donde la constante es un valor no nulo sustituido por cualquier resultado nulo.

Un ejemplo donde su expresión podría volver NULL es

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 
+0

Y no hay manera de especificar que este caso de desbordamiento es imposible? – naasking

Cuestiones relacionadas