Specificare le colonne calcolate in una tabellaSpecify Computed Columns in a Table

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Una colonna calcolata è una colonna virtuale che non viene archiviata fisicamente nella tabella, a meno che non sia contrassegnata come PERSISTED.A computed column is a virtual column that is not physically stored in the table, unless the column is marked PERSISTED. In un'espressione di colonna calcolata possono essere utilizzati dati di altre colonne per calcolare un valore per la colonna di appartenenza.A computed column expression can use data from other columns to calculate a value for the column to which it belongs. È possibile specificare un'espressione per una colonna calcolata in SQL Server 2017SQL Server 2017 utilizzando 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.

Contenuto dell'argomentoIn This Topic

Prima di iniziare Before You Begin

Limitazioni e restrizioni Limitations and Restrictions

  • Una colonna calcolata non può essere utilizzata come definizione di vincolo DEFAULT o FOREIGN KEY o con la definizione di vincolo NOT NULL.A computed column cannot be used as a DEFAULT or FOREIGN KEY constraint definition or with a NOT NULL constraint definition. È tuttavia possibile utilizzare una colonna calcolata come colonna chiave di un indice o come parte di un vincolo PRIMARY KEY o UNIQUE, a condizione che il valore della colonna calcolata sia definito da un'espressione deterministica e il tipo di dati del risultato sia supportato nelle colonne dell'indice.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. Se, ad esempio, la tabella contiene le colonne di tipo integer a e b, è possibile indicizzare la colonna calcolata a + b, ma non la colonna calcolata a+DATEPART(dd, GETDATE()), in quanto durante chiamate successive il valore potrebbe cambiare.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.

  • Non è possibile usare una colonna calcolata in un'istruzione INSERT o UPDATE.A computed column cannot be the target of an INSERT or UPDATE statement.

Sicurezza Security

Autorizzazioni Permissions

È necessario disporre dell'autorizzazione ALTER per la tabella.Requires ALTER permission on the table.

Utilizzo di SQL Server Management Studio Using SQL Server Management Studio

Per aggiungere una nuova colonna calcolata To add a new computed column

  1. In Esplora oggettiespandere la tabella per cui si desidera aggiungere la nuova colonna calcolata.In Object Explorer, expand the table for which you want to add the new computed column. Fare clic con il pulsante destro del mouse su Colonne e scegliere Nuova colonna.Right-click Columns and select New Column.

  2. Immettere il nome della colonna e accettare il tipo di dati predefinito,nchar(10).Enter the column name and accept the default data type (nchar(10)). Il Motore di databaseDatabase Engine determina il tipo di dati della colonna calcolata applicando le regole sulla precedenza dei tipi di dati alle espressioni specificate nella formula.The Motore di databaseDatabase Engine determines the data type of the computed column by applying the rules of data type precedence to the expressions specified in the formula. Ad esempio, se la formula fa riferimento a una colonna di tipo money e una colonna di tipo int, la colonna calcolata sarà di tipo money perché tale tipo di dati ha precedenza maggiore.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. Per altre informazioni, vedere Precedenza dei tipi di dati (Transact-SQL).For more information, see Data Type Precedence (Transact-SQL).

  3. Nella scheda Proprietà colonne espandere la proprietà Specifica della colonna calcolata .In the Column Properties tab, expand the Computed Column Specification property.

  4. Nella proprietà figlio (Formula) immettere l'espressione per la colonna nella cella della griglia a destra.In the (Formula) child property, enter the expression for this column in the grid cell to the right. Ad esempio, in una colonna SalesTotal , la formula immessa potrebbe essere SubTotal+TaxAmt+Freight, che aggiunge il valore in queste colonne per ogni riga della tabella.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

    Quando una formula combina due espressioni di tipi di dati diversi, le regole per la precedenza dei tipi di dati specificano che i tipi con precedenza inferiore vengano convertiti nei tipi con precedenza superiore.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. Se la conversione non è una conversione implicita supportata, viene restituito l'erroreError 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. Utilizzare la funzione CAST o CONVERT per risolvere il conflitto del tipo di dati.Use the CAST or CONVERT function to resolve the data type conflict. Ad esempio, se una colonna di tipo nvarchar viene combinata con una colonna di tipo int, il tipo integer deve essere convertito in nvarchar come mostrato in questa formula ('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)). Per altre informazioni, vedere CAST e CONVERT (Transact-SQL).For more information, see CAST and CONVERT (Transact-SQL).

  5. Indicare se i dati sono persistenti selezionando oppure No nell'elenco a discesa della proprietà figlio Persistente.Indicate whether the data is persisted by choosing Yes or No from the drop-down for the Is Persisted child property.

  6. Nel menu File scegliere Salvatable name.On the File menu, click Savetable name.

Per aggiungere una definizione di colonna calcolata a una colonna esistenteTo add a computed column definition to an existing column

  1. In Esplora oggettifare clic con il pulsante destro del mouse sulla tabella con la colonna per cui si vuole modificare ed espandere la cartella Colonne .In Object Explorer, right-click the table with the column for which you want to change and expand the Columns folder.

  2. Fare clic con il pulsante destro del mouse sulla colonna per cui si vuole specificare una formula di colonna calcolata e scegliere Elimina.Right-click the column for which you want to specify a computed column formula and click Delete. Scegliere OK.Click OK.

  3. Aggiungere una nuova colonna e specificare la formula della colonna calcolata attenendosi alla procedura precedente per aggiungere una nuova colonna calcolata.Add a new column and specify the computed column formula by following the previous procedure to add a new computed column.

Utilizzo di Transact-SQL Using Transact-SQL

Per aggiungere una colonna calcolata quando si crea una tabellaTo add a computed column when creating a table

  1. Connettersi al Motore di databaseDatabase Engine.Connect to the Motore di databaseDatabase Engine.

  2. Dalla barra Standard fare clic su Nuova query.From the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and then click Execute. Nell'esempio viene creata una tabella con una colonna calcolata che moltiplica il valore della colonna QtyAvailable per il valore della colonna 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;  
    

Per aggiungere una nuova colonna calcolata a una tabella esistenteTo add a new computed column to an existing table

  1. Connettersi al Motore di databaseDatabase Engine.Connect to the Motore di databaseDatabase Engine.

  2. Dalla barra Standard fare clic su Nuova query.From the Standard bar, click New Query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and then click Execute. Nell'esempio seguente viene aggiunta una nuova colonna alla tabella creata nell'esempio precedente.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);  
    

Per impostare una colonna esistente su una colonna calcolataTo change an existing column to a computed column

  1. Connettersi al Motore di databaseDatabase Engine.Connect to the Motore di databaseDatabase Engine.

  2. Dalla barra Standard fare clic su Nuova query.From the Standard bar, click New Query.

  3. Per modificare una colonna esistente in una colonna calcolata, rilasciare e ricreare la colonna calcolata.To change an existing column to a computed column you must drop and re-create the computed column. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui.Copy and paste the following example into the query window and then click Execute. Nell'esempio seguente viene modificata la colonna aggiunta nell'esempio precedente.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);  
    

    Per altre informazioni, vedere ALTER TABLE (Transact-SQL).For more information, see ALTER TABLE (Transact-SQL).