Especificar columnas calculadas en una tablaSpecify Computed Columns in a Table

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2016)síAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Una columna calculada es una columna virtual que no está almacenada físicamente en la tabla, a menos que la columna esté marcada con PERSISTED.A computed column is a virtual column that is not physically stored in the table, unless the column is marked PERSISTED. Las expresiones de columnas calculadas pueden utilizar datos de otras columnas al calcular un valor para la columna a la que pertenecen.A computed column expression can use data from other columns to calculate a value for the column to which it belongs. Puede especificar una expresión para una columna calculada en SQL Server 2017SQL Server 2017 mediante SQL Server Management StudioSQL Server Management Studio o Transact-SQLTransact-SQL.You can specify an expression for a computed column in in SQL Server 2017SQL Server 2017 by using SQL Server Management StudioSQL Server Management Studio or Transact-SQLTransact-SQL.

En este temaIn This Topic

Antes de empezarBefore You Begin

Limitaciones y restriccionesLimitations and Restrictions

  • Una columna calculada no puede utilizarse como definición de restricción DEFAULT o FOREIGN KEY ni como NOT NULL.A computed column cannot be used as a DEFAULT or FOREIGN KEY constraint definition or with a NOT NULL constraint definition. No obstante, si el valor de columna calculada lo define una expresión determinista y se permite el tipo de datos del resultado en columnas de índice, se puede utilizar una columna calculada como columna de clave en un índice o como parte de cualquier restricción PRIMARY KEY o UNIQUE.However, if the computed column value is defined by a deterministic expression and the data type of the result is allowed in index columns, a computed column can be used as a key column in an index or as part of any PRIMARY KEY or UNIQUE constraint. Por ejemplo, si la tabla tiene las columnas de tipo entero a y b, la columna calculada a + b se puede indizar, pero la columna calculada a + DATEPART(dd, GETDATE()) no, porque el valor podría variar en llamadas posteriores.For example, if the table has integer columns a and b, the computed column a + b may be indexed, but computed column a + DATEPART(dd, GETDATE()) cannot be indexed, because the value might change in subsequent invocations.

  • Una columna calculada no puede ser el destino de una instrucción INSERT o UPDATE.A computed column cannot be the target of an INSERT or UPDATE statement.

SeguridadSecurity

PermissionsPermissions

Requiere el permiso ALTER en la tabla.Requires ALTER permission on the table.

Usar SQL Server Management StudioUsing SQL Server Management Studio

Para agregar una nueva columna calculadaTo add a new computed column

  1. En el Explorador de objetos, expanda la tabla para la que desea agregar la nueva columna calculada.In Object Explorer, expand the table for which you want to add the new computed column. Haga clic con el botón derecho en Columnas y seleccione Nueva columna.Right-click Columns and select New Column.

  2. Escriba el nombre de columna y acepte el tipo de datos predeterminado (nchar(10)).Enter the column name and accept the default data type (nchar(10)). El Motor de base de datosDatabase Engine determina el tipo de datos de la columna calculada aplicando las reglas de prioridad de tipo de datos a las expresiones especificadas en la fórmula.The Motor de base de datosDatabase Engine determines the data type of the computed column by applying the rules of data type precedence to the expressions specified in the formula. Por ejemplo, si la fórmula hace referencia a una columna de tipo money y una columna de tipo int, la columna calculada será de tipo money porque ese tipo de datos tiene mayor prioridad.For example, if the formula references a column of type money and a column of type int, the computed column will be of type money because that data type has the higher precedence. Para obtener más información, vea Prioridad de tipo de datos (Transact-SQL).For more information, see Data Type Precedence (Transact-SQL).

  3. En la pestaña Propiedades de columna , expanda la propiedad Especificación de columna calculada .In the Column Properties tab, expand the Computed Column Specification property.

  4. En la propiedad secundaria (Fórmula) , escriba la expresión de esta columna en la celda de la cuadrícula situada a la derecha.In the (Formula) child property, enter the expression for this column in the grid cell to the right. Por ejemplo, en una columna SalesTotal , la fórmula que escribe puede ser SubTotal+TaxAmt+Freight, que suma el valor de estas columnas para cada fila de la tabla.For example, in a SalesTotal column, the formula you enter might be SubTotal+TaxAmt+Freight, which adds the value in these columns for each row in the table.

    Importante

    Cuando una fórmula combina dos expresiones de tipos de datos distintos, las reglas de prioridad de tipo de datos especifican que el tipo de datos con la prioridad menor se convierta al tipo de datos con la prioridad mayor.When a formula combines two expressions of different data types, the rules for data type precedence specify that the data type with the lower precedence is converted to the data type with the higher precedence. Si la conversión no es una conversión implícita admitida, se devuelve el error "Error validating the formula for column column_name.".If the conversion is not a supported implicit conversion, the error "Error validating the formula for column column_name." is returned. Use la función CAST o CONVERT para resolver el conflicto de tipos de datos.Use the CAST or CONVERT function to resolve the data type conflict. Por ejemplo, si una columna de tipo nvarchar se combina con una de tipo int, el tipo entero debe convertirse a nvarchar como se muestra en esta fórmula: ('Prod'+CONVERT(nvarchar(23),ProductID)).For example, if a column of type nvarchar is combined with a column of type int, the integer type must be converted to nvarchar as shown in this formula ('Prod'+CONVERT(nvarchar(23),ProductID)). Para obtener más información, vea CAST y CONVERT (Transact-SQL).For more information, see CAST and CONVERT (Transact-SQL).

  5. Indique si los datos se van a conservar; para ello, elija o No en el menú desplegable de la propiedad secundaria Es persistente .Indicate whether the data is persisted by choosing Yes or No from the drop-down for the Is Persisted child property.

  6. En el menú Archivo, haga clic en Guardarnombre de tabla.On the File menu, click Savetable name.

Para agregar una definición de columna calculada a una columna existenteTo add a computed column definition to an existing column

  1. En el Explorador de objetos, haga clic con el botón derecho en la tabla que contenga la columna que quiera cambiar y expanda la carpeta Columnas .In Object Explorer, right-click the table with the column for which you want to change and expand the Columns folder.

  2. Haga clic con el botón derecho en la columna para la que quiera especificar una fórmula de columna calculada y haga clic en Eliminar.Right-click the column for which you want to specify a computed column formula and click Delete. Haga clic en Aceptar.Click OK.

  3. Agregue una nueva columna y especifique la fórmula de columna calculada siguiendo el procedimiento anterior para agregar una nueva columna calculada.Add a new column and specify the computed column formula by following the previous procedure to add a new computed column.

Usar Transact-SQLUsing Transact-SQL

Para agregar una columna calculada al crear una tablaTo add a computed column when creating a table

  1. Conéctese con el Motor de base de datosDatabase Engine.Connect to the Motor de base de datosDatabase Engine.

  2. En la barra Estándar, haga clic en Nueva consulta.From the Standard bar, click New Query.

  3. Copie y pegue el ejemplo siguiente en la ventana de consulta y, a continuación, haga clic en Ejecutar.Copy and paste the following example into the query window and then click Execute. En el ejemplo se crea una tabla con una columna calculada que multiplica el valor de la columna QtyAvailable tantas veces como indique el valor de la columna UnitPrice .The example creates a table with a computed column that multiplies the value in the QtyAvailable column times the value in the UnitPrice column.

    CREATE TABLE dbo.Products   
    (  
        ProductID int IDENTITY (1,1) NOT NULL  
      , QtyAvailable smallint  
      , UnitPrice money  
      , InventoryValue AS QtyAvailable * UnitPrice  
    );  
    
    -- Insert values into the table.  
    INSERT INTO dbo.Products (QtyAvailable, UnitPrice)  
    VALUES (25, 2.00), (10, 1.5);  
    
    -- Display the rows in the table.  
    SELECT ProductID, QtyAvailable, UnitPrice, InventoryValue  
    FROM dbo.Products;  
    

Para agregar una nueva columna calculada a una tabla existenteTo add a new computed column to an existing table

  1. Conéctese con el Motor de base de datosDatabase Engine.Connect to the Motor de base de datosDatabase Engine.

  2. En la barra Estándar, haga clic en Nueva consulta.From the Standard bar, click New Query.

  3. Copie y pegue el ejemplo siguiente en la ventana de consulta y, a continuación, haga clic en Ejecutar.Copy and paste the following example into the query window and then click Execute. En el ejemplo siguiente se agrega una columna nueva a la tabla creada en el ejemplo anterior.The following example adds a new column to the table created in the previous example.

    ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.35);  
    

Para cambiar una columna existente a una columna calculadaTo change an existing column to a computed column

  1. Conéctese con el Motor de base de datosDatabase Engine.Connect to the Motor de base de datosDatabase Engine.

  2. En la barra Estándar, haga clic en Nueva consulta.From the Standard bar, click New Query.

  3. Para cambiar una columna existente a una columna calculada, debe quitar y volver a crear la columna calculada.To change an existing column to a computed column you must drop and re-create the computed column. Copie y pegue el ejemplo siguiente en la ventana de consulta y, a continuación, haga clic en Ejecutar.Copy and paste the following example into the query window and then click Execute. En el ejemplo siguiente se modifica la columna agregada en el ejemplo anterior.The following example modifies the column added in the previous example.

    ALTER TABLE dbo.Products DROP COLUMN RetailValue;  
    GO  
    ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5);  
    

    Para obtener más información, vea ALTER TABLE (Transact-SQL).For more information, see ALTER TABLE (Transact-SQL).