Condividi tramite


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