28% de descuento del curso en SQL Server

Estrada Web Group Estrada Web Group
Columnas calculadas
Estrada Web Group
Estrada Web Group
Estrada Web Group Estrada Web Group
Calificar:
19 August SQL

Columnas calculadas en SQL Server

Resumen: en este tutorial, aprenderá a usar las columnas calculadas de SQL Server para reutilizar la lógica de cálculo en varias consultas.

Introducción a las columnas calculadas de SQL Server

Vamos a crear una nueva tabla con el nombre de persons para ver los ejemplos:

CREATE TABLE persons
(
    person_id  INT PRIMARY KEY IDENTITY,
    first_name NVARCHAR(100) NOT NULL,
    last_name  NVARCHAR(100) NOT NULL,
    dob        DATE
);

Ahora inserta dos filas en la tabla de persons

INSERT INTO
    persons(first_name, last_name, dob)
VALUES
    ('Estrada','Web Group','1990-05-01'),
    ('Estrada','Web Group','1995-03-01');

Para consultar los nombres completos de las personas en la tabla persons, normalmente usa la función CONCAT() o el operador + de la siguiente manera:

SELECT
    person_id,
    first_name + ' ' + last_name AS full_name,
    dob
FROM
    persons
ORDER BY
    full_name;
person_id full_name dob
1 Estrada Web Group 1990-05-01
2 Estrada Web Group 1990-05-01

Agregar la expresión full_name con first_name + ' ' + last_name en cada consulta no es conveniente.

Afortunadamente, SQL Server nos brinda una función llamada columnas calculadas que permite agregar una nueva columna a una tabla con el valor derivado de los valores de otras columnas en la misma tabla.

Por ejemplo, puedes agregar la columna full_name a la tabla de personas usando la columna ALTER TABLE ADD de la siguiente manera:

ALTER TABLE persons
ADD full_name AS (first_name + ' ' + last_name);

Cada vez que consultas datos de la tabla de persons, SQL Server calcula el valor de la columna full_name en función de la expresión first_name + ' ' + last_name y devuelve el resultado.

Aquí está la nueva consulta, que es más compacta

SELECT
    person_id,
    full_name,
    dob
FROM
    persons
ORDER BY
    full_name;

Si examinas la tabla de personas, puedes ver que aparece la nueva columna full_name en la lista de columnas:

SQL Server column PERSISTED

Columnas calculadas persistentes

Las columnas calculadas se pueden conservar. Significa que SQL Server almacena físicamente los datos de las columnas calculadas en el disco.

Cuando cambian los datos en la tabla, SQL Server calcula el resultado en función de la expresión de las columnas calculadas y almacena físicamente los resultados en estas columnas persistentes. Cuando consulta los datos de las columnas calculadas persistentes, SQL Server solo necesita recuperar los datos sin realizar ningún cálculo. Esto evita la sobrecarga de cálculo con el costo del almacenamiento adicional.

Considera el siguiente ejemplo.

Primero, elimina la columna full_name de la tabla de personas:

ALTER TABLE persons
DROP COLUMN full_name;

Luego, agrega la nueva columna full_name a la tabla de personas con la propiedad PERSISTED:

ALTER TABLE persons
ADD full_name AS (first_name + ' ' + last_name) PERSISTED;

Ten en cuenta que una columna calculada se conserva solo si su expresión es determinista. Significa que, para un conjunto de entradas, la expresión siempre devuelve el mismo resultado.

Por ejemplo, la expresión first_name + ' ' + last_name es determinista. Sin embargo, la función GETDATE() es una función no determinista porque devuelve un valor diferente en un día diferente.

Esta fórmula devuelve la edad en años según la fecha de nacimiento y la fecha actual:

(CONVERT(INT,CONVERT(CHAR(8),GETDATE(),112))-CONVERT(CHAR(8),dob,112))/10000

Podemos usar esta expresión para definir la edad en la columna calculada del año.

La siguiente declaración intenta definir la columna age_in_yearcomputed como una columna calculada persistente:

ALTER TABLE persons
ADD age_in_years
    AS (CONVERT(INT,CONVERT(CHAR(8),GETDATE(),112))-CONVERT(CHAR(8),dob,112))/10000
PERSISTED;

El servidor SQL emite el siguiente error:

Computed column 'age_in_years' in table 'persons' cannot be persisted because the column is non-deterministic.

Si eliminas la propiedad PERSISTED, debería funcionar:

ALTER TABLE persons
ADD age_in_years
    AS (CONVERT(INT,CONVERT(CHAR(8),GETDATE(),112))-CONVERT(CHAR(8),dob,112))/10000;

Ahora, puedes consultar la edad en años de las personas en la tabla de persons de la siguiente manera:

SELECT
    person_id,
    full_name,
    age_in_years
FROM
    persons
ORDER BY
    age_in_years DESC;

Resultado:

person_id full_name age_in_years
1 Estrada Web Group 28
2 Estrada Web Group 24

 

La sintaxis para agregar columnas calculadas a una tabla

Para agregar una nueva columna calculada a una tabla existente, utiliza la siguiente sintaxis:

ALTER TABLE table_name
ADD column_name AS expression [PERSISTED];

En esta sintaxis:

  • Primero, especifique el nombre de la tabla a la que deseas agregar la columna calculada.
  • En segundo lugar, especifica el nombre de la columna calculada con la expresión que devuelve los valores de la columna.
  • En tercer lugar, si la expresión es determinista y deseas almacenar físicamente los datos de la columna calculada, puedes utilizar la propiedad PERSISTED.

 

Ten en cuenta que puedes crear un índice en una columna calculada persistente para mejorar la velocidad de recuperación de datos de la columna calculada. Es una buena solución alternativa para índices basados en funciones de Oracle o índices en expresiones de PostgreSQL.

La sintaxis para definir columnas calculadas al crear una nueva tabla

Para definir una columna calculada cuando creas una tabla, utiliza la siguiente sintaxis:

CREATE TABLE table_name(
    ...,
    column_name AS expression [PERSISTED],
    ...
);

En este tutorial, aprendiste a usar las columnas calculadas de SQL Server para reutilizar la lógica de cálculo en varias consultas.

 

Compartir:

Cargando...
Descarga el código fuente

Obten el código del sistema de gestión de proyectos.

Shape