vacio - validar campo null sql server




Cómo hacer una columna de vista NOT NULL (3)

Intento crear una vista donde quiero que una columna sea verdadera o falsa. Sin embargo, parece que no importa lo que haga, SQL Server (2008) cree que mi columna de bits puede ser nula de alguna manera.

Tengo una tabla llamada "Producto" con la columna "Estado" que es INT, NULL . En una vista, quiero devolver una fila para cada fila en Producto, con una columna BIT establecida en verdadero si la columna Product.Status es igual a 3, de lo contrario, el campo de bit debería ser falso.

Ejemplo SQL

SELECT CAST( CASE ISNULL(Status, 0)  
               WHEN 3 THEN 1  
               ELSE 0  
             END AS bit) AS HasStatus  
FROM dbo.Product  

Si guardo esta consulta como una vista y miro las columnas en el Explorador de objetos, la columna HasStatus se establece en BIT, NULL . Pero nunca debería ser NULL. ¿Hay algún truco mágico de SQL que pueda usar para forzar que esta columna NOT NULL sea NOT NULL ?

Tenga en cuenta que, si elimino el CAST() alrededor del CASE , la columna se establece correctamente como NOT NULL , pero luego el tipo de columna se establece en INT , que no es lo que quiero. Quiero que sea BIT . :-)


Este es el código que uso, hará que la columna de ID NO sea NULA y todas las demás NULAS. Debe convertir la columna de bit o varchar y comparar la columna int con NULL.

CREATE TABLE [dbo].[aTestTable](
    [ID] [int] NOT NULL,
    [varcharCol] [varchar](50) NOT NULL,
    [nullvarcharCol] [varchar](50) NULL,
    [bitCol] [bit] NOT NULL,
    [nullbitCol] [bit] NULL,
    [intCol] [int] NOT NULL,
    [nullintCol] [int] NULL,
 CONSTRAINT [PK_aTestTable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE VIEW [dbo].[aTestView]
AS
SELECT  ID ,
        NULLIF(varcharCol , '') AS varcharCol ,
        NULLIF(CAST(varcharCol AS VARCHAR), null) AS varcharCol1, --better
        nullvarcharCol ,
        NULLIF(CAST(bitCol AS INT), null) AS bitCol ,
        nullbitCol ,
        NULLIF(CAST(intCol AS INT), NULL) AS intCol ,
        nullintCol
FROM    dbo.aTestTable


Sample Data:

ID  varcharCol  nullvarcharCol  bitCol  nullbitCol  intCol  nullintCol
1   1   1   1   1   1   1
2   0   0   0   0   0   0
3   0   NULL    0   NULL    0   NULL
4   a   a   1   1   2   2

hth


FYI, para las personas que se encuentran con este mensaje, agregar ISNULL () alrededor de la parte exterior del elenco / conversión puede arruinar el optimizador en su vista.

Teníamos 2 tablas que usaban el mismo valor que una clave de índice pero con tipos de precisión numérica diferente (mal, lo sé) y nuestra vista se unía a ellas para producir el resultado final. Pero nuestro código de middleware estaba buscando un tipo de datos específico, y la vista tenía un CONVERT () alrededor de la columna devuelta

Noté, como lo hizo el PO, que los descriptores de columna del resultado de la vista lo definían como nulable y yo pensaba que era una clave primaria / externa en 2 tablas; ¿Por qué querríamos que el resultado se definiera como anulable?

Encontré esta publicación, arrojé ISNULL () alrededor de la columna y voilá - ya no se puede escribir un nulo.

El problema fue que el rendimiento de la vista se fue directamente al inodoro cuando se filtró una consulta en esa columna.

Por alguna razón, un CONVERTIR explícitamente () en la columna de resultados de la vista no arruinó el optimizador (iba a tener que hacer eso de todos modos debido a las diferentes precisiones) pero agregar una envoltura ISNULL () redundante sí, en un gran camino.


Todo lo que puede hacer en una declaración Select es controlar los datos que el motor de la base de datos le envía como cliente. La instrucción select no tiene ningún efecto en la estructura de la tabla subyacente. Para modificar la estructura de la tabla, necesita ejecutar una declaración Alter Table.

  1. Primero asegúrese de que no haya nulos en ese campo de bit en la tabla
  2. A continuación, ejecute la siguiente instrucción ddl: Alter Table dbo.Product Alter column status bit not null

Si, otoh, todo lo que estás tratando de hacer es controlar el resultado de la vista, entonces lo que estás haciendo es suficiente. Su sintaxis garantizará que el resultado de la columna HasStatus en el resultado de vistas nunca sea ​​nulo. Siempre será un valor de bit = 1 o un valor de bit = 0. No se preocupe por lo que dice el explorador de objetos ...





sql-view