Colonne calcolate

Queste colonne vengono calcolate in base a un'espressione che utilizza altre colonne della stessa tabella. L'espressione può essere un nome di colonna non calcolata, una costante, una funzione e qualsiasi combinazione di questi elementi collegati da uno o più operatori. L'espressione non può essere una sottoquery.

Ad esempio, nel database di esempio AdventureWorks alla colonna TotalDue della tabella Sales.SalesOrderHeader è associata la definizione TotalDue AS Subtotal + TaxAmt + Freight.

Se non diversamente specificato, le colonne calcolate sono colonne virtuali che non sono archiviate fisicamente nella tabella. I valori di tali colonne vengono ricalcolati ogni volta che una query vi fa riferimento. In Motore di database viene utilizzata la parola chiave PERSISTED nelle istruzioni CREATE TABLE e ALTER TABLE per archiviare fisicamente nella tabella le colonne calcolate. I valori delle colonne vengono aggiornati ogni volta che una colonna utilizzata nel calcolo viene modificata. Se si contrassegna una colonna calcolata come PERSISTED, è possibile creare un indice in base a una colonna calcolata deterministica ma non precisa. Inoltre, se una colonna calcolata fa riferimento a una funzione CLR, Motore di database non è in grado di verificare se la funzione è realmente deterministica. In questo caso, per creare un indice sulla base della colonna calcolata è necessario assegnare alla colonna l'attributo PERSISTED. Per ulteriori informazioni, vedere Creazione di indici per le colonne calcolate.

[!NOTA]

Le colonne calcolate utilizzate come colonne di partizionamento di una tabella partizionata devono essere rese persistenti in modo esplicito.

È possibile utilizzare le colonne calcolate in elenchi di selezione, clausole WHERE e ORDER BY o nelle altre posizioni in cui è possibile utilizzare espressioni regolari, con le seguenti eccezioni:

  • Le colonne calcolate utilizzate come vincoli CHECK, FOREIGN KEY o NOT NULL devono essere contrassegnate come PERSISTED. È 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 sia definito da un'espressione deterministica e il tipo di dati del risultato sia supportato nelle colonne dell'indice.

    Se ad esempio la tabella include le colonne integer a e b, la colonna calcolata a + b può essere indicizzata, mentre la colonna calcolata a + DATEPART(dd, GETDATE()) non può essere indicizzata perché il valore può cambiare nelle chiamate successive.

  • Non è possibile utilizzare una colonna calcolata in un'istruzione INSERT o UPDATE.

Motore di database determina automaticamente il supporto di valori Null nelle colonne calcolate sulla base delle espressioni utilizzate. Si presuppone che per il risultato della maggior parte delle espressioni i valori Null siano ammessi anche se sono disponibili solo colonne che non ammettono valori Null. Possibili underflow o overflow, infatti, generano risultati Null. Per stabilire se una colonna calcolata di una tabella ammette i valori Null, utilizzare la funzione COLUMNPROPERTY con la proprietà AllowsNull. Un'espressione che ammette i valori Null può essere trasformata in espressione che non ammette i valori Null specificando ISNULL(check_expression**,**constant), dove constant è un valore non Null che sostituisce tutti i risultati Null.