SQL Server, columnas calculadas

Aquí os dejo algunos apuntes básicos sobre las columnas calculadas en SQL Server.

¿Cuando se calculan?

Depende de cómo defina la columna calculada. Una columna calculada PERSISTIDA se calculará y luego se almacenará como datos dentro de la tabla al ser creada. Si no define la columna como PERSISTIDA, se calculará cada vez que se ejecute una consulta que la incluya.

Mas info aquí.

Tablas temporales o versionadas

La modificación del esquema de una tabla versionada por el sistema (tablas temporales) falla porque no se admite agregar una columna calculada mientras el versionado del sistema está activado. Para solucionarlo:

  1. Primero desactivar el versionado
  2. Luego agregar la columna calculada a la tabla base
  3. Verificar el tipo de la columna calculada resultante
  4. Agregar la columna con el tipo estático apropiado a la tabla de historial (tabla temporal o tabla versionada)
  5. Volver a activar el versionado

Otra cosa a tener en cuenta es que una columna calculada que utiliza una función definida por el usuario no está permitida dentro de una tabla temporal porque realiza el acceso a los datos del usuario o del sistema, o se supone que realiza este acceso. Se asume que una función realiza de forma predeterminada el acceso a datos si no está vinculada al esquema (schemabound).

Persistir columna no determinista

Una columna calculada no se puede persistir si la columna no es determinista.

Las funciones deterministas siempre devuelven el mismo resultado cada vez que se llaman con un conjunto específico de valores de entrada y el mismo estado de la base de datos. Las funciones no deterministas pueden devolver resultados diferentes cada vez que se llaman con un conjunto específico de valores de entrada, incluso si el estado de la base de datos al que acceden sigue siendo el mismo. Por ejemplo, la función AVG siempre devuelve el mismo resultado si los datos no cambian, pero la función GETDATE, que devuelve el valor actual de fecha y hora, siempre devuelve un resultado diferente. Mas información aquí y aquí.

Comentarios