condicional columna campos campo calculados calculado calculada agregar sql sql-server calculated-columns

campos - sql server columna calculada condicional



¿Cuál es el tipo de datos de una columna calculada? (2)

Además, si desea forzar un tipo de datos específico en lugar de confiar en la precedencia del tipo de datos, puede usar CONVERT o CAST en el cálculo para forzarlo (suponiendo que todos los resultados posibles sean compatibles con el tipo que elija). Esto puede ser muy útil en los casos en los que, de forma predeterminada, usted obtiene un tipo de datos más amplio del que deseaba; El caso de uso más común que he visto es cuando terminas con un INT en lugar de, digamos, un BIT:

Active1 AS CASE WHEN something THEN 1 ELSE 0 END, Active2 AS CONVERT(BIT, CASE WHEN something THEN 1 ELSE 0 END)

En este caso, Active1 es una INT (4 bytes), mientras que Active2 es una BIT (1 byte, potencialmente, si es adyacente a otras columnas de BIT ).

Cuando CREATE TABLE usando la expresión CASE para crear una columna calculada, no define explícitamente el tipo de datos de esta columna:

CREATE TABLE OrderDetail ( OrderID INT , ProductID INT , Qty INT , OrderDate DATETIME , ShipDate DATETIME , STATUS AS CASE WHEN shipdate is NULL AND orderdate < DATEADD( dd, -7, GETDATE()) THEN 3 WHEN shipdate is NOT NULL THEN 2 ELSE 1 end ) GO

¿Cómo SQL Server decide el tipo de datos de esta columna?


Para una expresión CASE , es la rama con la mayor precedencia de tipos de datos . En su ejemplo, las tres ramas son literales que están en el rango que se interpretarán como enteros, por lo que el tipo de columna será int

Puede usar sql_variant_property para determinar qué tipo de datos es una expresión literal según mi respuesta aquí . por ejemplo, 2147483648 se interpreta como numeric(10,0) lugar de bigint .

En el caso de la pregunta, SQL Server reconoce que la columna resultante NOT NULL será NOT NULL pero a menudo para las expresiones calculadas es necesario envolver la expresión en un ISNULL para obtener ese efecto.