Condividi tramite


Specificare le colonne calcolate in una tabella

Una colonna calcolata è una colonna virtuale non archiviata fisicamente nella tabella, a meno che la colonna non sia contrassegnata come PERSISTED. In un'espressione di colonna calcolata possono essere utilizzati dati di altre colonne per calcolare un valore per la colonna di appartenenza. È possibile specificare un'espressione per una colonna calcolata in SQL Server 2014 usando SQL Server Management Studio o Transact-SQL.

Contenuto dell'articolo

Prima di iniziare

Limitazioni e restrizioni

  • Una colonna calcolata non può essere utilizzata come definizione di vincolo DEFAULT o FOREIGN KEY o con una definizione di vincolo NOT NULL. Tuttavia, se il valore della colonna calcolata è definito da un'espressione deterministica e il tipo di dati del risultato è consentito nelle colonne di indice, è possibile usare una colonna calcolata come colonna chiave in un indice o come parte di qualsiasi vincolo PRIMARY KEY o UNIQUE. Ad esempio, se la tabella contiene colonne di tipo integer a e b, la colonna calcolata a + b può essere indicizzata, ma la colonna calcolata a + DATEPART(dd, GETDATE()) non può essere indicizzata, perché il valore potrebbe cambiare nelle invocazioni successive.

  • Una colonna calcolata non può essere la destinazione di un'istruzione INSERT o UPDATE.

Sicurezza

Autorizzazioni

È necessario disporre dell'autorizzazione ALTER sulla tabella.

Uso di SQL Server Management Studio

Per aggiungere una nuova colonna calcolata

  1. In Esplora oggettiespandere la tabella per cui si desidera aggiungere la nuova colonna calcolata. Fare clic con il pulsante destro del mouse su Colonne e scegliere Nuova colonna.

  2. Immettere il nome della colonna e accettare il tipo di dati predefinito (nchar(10)). Il motore di database determina il tipo di dati della colonna calcolata applicando le regole sulla precedenza dei tipi di dati alle espressioni specificate nella formula. Ad esempio, se la formula fa riferimento a una colonna di tipo money e a una colonna di tipo int, la colonna calcolata sarà di tipo perché tale tipo money di dati ha la precedenza maggiore. Per altre informazioni, vedere Precedenza dei tipi di dati (Transact-SQL).

  3. Nella scheda Proprietà colonne espandere la proprietà Specifica della colonna calcolata .

  4. Nella proprietà figlia (Formula), inserire l'espressione per questa colonna nella cella della griglia a destra. 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.

    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. Se la conversione non è una conversione implicita supportata, viene restituito l'errore "Error validating the formula for column column_name.". Usare la funzione CAST o CONVERT per risolvere il conflitto del tipo di dati. 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 illustrato in questa formula ('Prod'+CONVERT(nvarchar(23),ProductID)). Per altre informazioni, vedere CAST e CONVERT (Transact-SQL).

  5. Indicare se i dati persistono scegliendo o No dall'elenco a discesa per la proprietà figlia Is Persisted.

  6. Nel menu File fare clic su Salvanome tabella.

Per aggiungere una definizione di colonna calcolata a una colonna esistente

  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 .

  2. Fare clic con il pulsante destro del mouse sulla colonna per cui si desidera specificare una formula di colonna calcolata e scegliere Elimina. Fare clic su OK.

  3. Aggiungere una nuova colonna e specificare la formula della colonna calcolata attenendosi alla procedura precedente per aggiungere una nuova colonna calcolata.

Uso di Transact-SQL

Per aggiungere una colonna calcolata durante la creazione di una tabella

  1. Connettersi al Database Engine.

  2. Nella barra Standard fare clic su Nuova query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui. Nell'esempio viene creata una tabella con una colonna calcolata che moltiplica il valore nella colonna QtyAvailable per il valore nella colonna UnitPrice.

    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 esistente

  1. Connettersi al Database Engine.

  2. Nella barra Standard fare clic su Nuova query.

  3. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui. Nell'esempio seguente viene aggiunta una nuova colonna alla tabella creata nell'esempio precedente.

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

Per modificare una colonna esistente in una colonna calcolata

  1. Connettersi al Database Engine.

  2. Nella barra Standard fare clic su Nuova query.

  3. Per modificare una colonna esistente in una colonna calcolata, è necessario eliminare e ricreare la colonna calcolata. Copiare e incollare l'esempio seguente nella finestra Query, quindi fare clic su Esegui. Nell'esempio seguente viene modificata la colonna aggiunta nell'esempio precedente.

    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).