Columnas calculadas

Las columnas calculadas se calculan a partir de una expresión que puede utilizar otras columnas de la misma tabla. La expresión puede ser un nombre de columna no calculada, una constante, una función, y cualquier combinación de estos elementos conectados mediante uno o más operadores. La expresión no puede ser una subconsulta.

Por ejemplo, en la base de datos AdventureWorks2008R2, la columna TotalDue de la tabla Sales.SalesOrderHeader incluye la definición: TotalDue AS Subtotal + TaxAmt + Freight.

Si no se especifica lo contrario, las columnas calculadas son columnas virtuales no almacenadas físicamente en la tabla. Sus valores se vuelven a calcular cada vez que se utilizan en una consulta. Motor de base de datos utiliza la palabra clave PERSISTED en las instrucciones CREATE TABLE y ALTER TABLE para almacenar físicamente las columnas calculadas de la tabla. Sus valores se actualizan cuando cambia alguna columna que forma parte de su cálculo. Si se define una columna calculada como PERSISTED, se puede crear un índice en una columna calculada determinista pero no precisa. Además, si una columna calculada hace referencia a una función CLR, Motor de base de datos no puede comprobar si la función es realmente determinista. En este caso, la columna calculada debe establecerse en PERSISTED para que se puedan crear índices en ella. Para obtener más información, vea Crear índices en columnas calculadas.

Nota

Las columnas calculadas que se utilizan como columnas de partición en una tabla con particiones deben establecerse explícitamente en PERSISTED.

Las columnas calculadas se pueden utilizar en las listas de selección, cláusulas WHERE, cláusulas ORDER BY u otras ubicaciones en las que se puedan utilizar expresiones regulares, con las siguientes excepciones:

  • Las columnas calculadas que se utilizan como restricciones CHECK, FOREIGN KEY o NOT NULL deben marcarse como PERSISTED. Es posible utilizar una columna calculada como columna de clave en un índice o como parte de una restricción PRIMARY KEY o UNIQUE, si el valor de la columna calculada está definido mediante una expresión determinista y el tipo de datos del resultado es válido en columnas de índice.

    Por ejemplo, si la tabla incluye columnas de tipo entero a y b, la columna calculada a + b se puede indizar, pero la columna calculada a + DATEPART(dd, GETDATE()) no se puede indizar, ya que el valor puede cambiar en llamadas posteriores.

  • Una columna calculada no puede ser el destino de una instrucción INSERT o UPDATE.

Motor de base de datos determina automáticamente la nulabilidad de las columnas calculadas según las expresiones utilizadas. Se considera que el resultado de la mayoría de las expresiones admite valores NULL, incluso si sólo están presentes las columnas que no admiten valores NULL, ya que los posibles desbordamientos también darán como resultado valores NULL. Utilice la función COLUMNPROPERTY con la propiedad AllowsNull para determinar la nulabilidad de las columnas calculadas de una tabla. Una expresión que admite valores NULL se puede convertir en una que no los admite si se especifica ISNULL(check_expression**,**constant), donde constant es un valor no NULL reemplazado por cualquier resultado NULL.