Estoy tratando de crear una vista en la que quiero que una columna sea solo 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 bits debería ser falso.
SQL de ejemplo
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 NULO. ¿Hay algún truco mágico de SQL que pueda usar para forzar que esta columna sea NOT NULL
?
Tenga en cuenta que, si elimino el CAST()
alrededor de 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. Yo quiero que sea BIT
. :-)
COALESCE()
no funcionaba, en realidad tienes que usarloISNULL()
Para su información, para las personas que se encuentran con este mensaje, agregar el ISNULL () alrededor del exterior de la conversión / conversión puede estropear 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 (mala, lo sé) y nuestra vista se unía a ellas para producir el resultado final. Pero nuestro código de middleware buscaba un tipo de datos específico, y la vista tenía un CONVERT () alrededor de la columna devuelta
Noté, como lo hizo el OP, que los descriptores de columna del resultado de la vista lo definieron como anulable y estaba pensando que es una clave primaria / externa en 2 tablas; ¿Por qué querríamos que el resultado se definiera como anulable?
Encontré esta publicación, lancé ISNULL () alrededor de la columna y listo, ya no admite nulos.
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 CONVERT () explícito en la columna de resultados de la vista no arruinó el optimizador (iba a tener que hacerlo de todos modos debido a las diferentes precisiones) pero agregar un contenedor ISNULL () redundante sí lo hizo, en un gran camino.
fuente
CONVERT()
un ejemplo, por favor?Todo lo que puede hacer en una instrucció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 sobre la estructura de la tabla subyacente. Para modificar la estructura de la tabla, debe ejecutar una instrucción Alter Table.
Alter Table dbo.Product Alter column status bit not null
Si, otoh, todo lo que está tratando de hacer es controlar la salida de la vista, entonces lo que está haciendo es suficiente. Su sintaxis garantizará que la salida de la columna HasStatus en el conjunto de resultados de las vistas nunca será nula. Será siempre ser o valor de bit = 1 o el valor de bit = 0. No se preocupe lo que dice el explorador de objetos ...
fuente