2010-01-12 24 views
14

Es posible en SQL Server 2005 crear una columna calculada que sea tanto persistente como definida como NOT NULL (no puede contener un valor nulo). El segundo atributo es importante cuando se utilizan bibliotecas como Linq2Sql si queremos evitar mucho trabajo manual para asegurar a nuestro código que la columna 'siempre' tiene un valor.Marcado de columnas calculadas persistentes NOT NULL en SQL Server Management Studio

Con SQL recta Esto es muy simple:
ALTER TABLE Sales ADD Total AS (Price + Taxes) PERSISTED NOT NULL

Cuando se ve en la ventana de diseño de SQL Server Management Studio esta columna se muestra correctamente como una columna calculada sin marca de verificación para 'permite nulos'. Sin embargo, encuentro un problema al crear nuevas columnas en el diseñador para que coincida con este patrón: la fórmula se ingresa en la propiedad Especificación de columna calculada -> (Fórmula) y la propiedad persistente se especifica estableciendo Se persistió en Sí, pero intentando anular la selección el 'permite nulos' en una nueva columna calculada da como resultado un diálogo que dice "La propiedad no se puede modificar".

Necesito cubrir una amplia gama de niveles de habilidad, y para hacerlo necesito proporcionar procedimientos para agregar columnas que incluso un principiante puede seguir (lo que significa la ventana del diseñador de Management Studio). ¿Existe algún secreto en SQL Server Management Studio para crear una nueva columna calculada como NOT NULL en el diseñador, similar a decir cómo se puede usar CTRL + 0 para insertar valores nulos en las celdas?

Respuesta

16

Usted puede engañe esto con ISNULL(Price + Taxes, 0) que usa el valor predeterminado 0 para cálculos NULL.

0

yo probamos este y mirando a la vista de árbol de la izquierda que se había fijado de hecho la columna como no nula, a pesar de que en el derecho diseñador panel de la casilla de verificación no se comprobó ...

ALTER TABLE Sales ADD Total AS ISNULL(isnull(Price,0) + isnull(Taxes,0),0) PERSISTED NOT NULL 
1

De acuerdo con this article nullability es determinado por sqlserver basado en el posible valor de la expresión calculada. Dado que Price o Taxes es probablemente anulable, no puede estar seguro de que su suma nunca sea nula.

Sin embargo, como @Richard sugiere, el método ISNULL lo evita. La declaración de la columna NOT NULL no debería ser necesaria por lo que he entendido.

+0

Estoy en la misma situación, pero ni 'Precio' ni' Impuestos' son anulables. – xr280xr

10

Como notas de puntuación, puede hacer esto con ISNULL.

A menudo uso esto para indicadores calculados, por ejemplo, en la tabla User, tengo un DeletedDate para saber cuándo se eliminó la cuenta. Luego de crear una columna booleana no anulable computarizada llamada IsDeleted (tipo de bit) de esta manera:

isnull(case when DeletedDate is null then 0 else 1 end, 0) 

Lo importante a destacar es que el ISNULL debe estar en la parte más externa de la expresión para el diseñador para realizarla es una columna calculada que no admite nulos.

Cuestiones relacionadas