Colonnes calculées

Une colonne calculée est calculée à partir d'une expression qui peut utiliser d'autres colonnes de la même table. L'expression peut être un nom de colonne non calculée, une constante, une fonction et toute combinaison de ces éléments reliés par un ou plusieurs opérateurs. L'expression ne peut pas être une sous-requête.

Par exemple, dans l'exemple de base de données AdventureWorks2008R2, la colonne TotalDue de la table Sales.SalesOrderHeader possède la définition suivante : TotalDue AS Subtotal + TaxAmt + Freight.

Sauf spécification contraire, les colonnes calculées sont des colonnes virtuelles qui ne sont pas stockées physiquement dans la table. Leurs valeurs sont recalculées chaque fois qu'elles sont référencées dans une requête. Le moteur Moteur de base de données utilise le mot clé PERSISTED dans les instructions CREATE TABLE et ALTER TABLE pour stocker physiquement les colonnes calculées dans la table. Leurs valeurs sont mises à jour en cas de modification de certaines colonnes impliquées dans leur calcul. En marquant une colonne calculée comme PERSISTED, vous pouvez créer un index déterministe, mais imprécis, sur une colonne calculée. En outre, si une colonne calculée fait référence à une fonction CLR, le moteur de base de données ne peut pas vérifier si la fonction est réellement déterministe. Dans ce cas, la colonne calculée doit être marquée comme PERSISTED afin que des index puissent être créés sur elle. Pour plus d'informations, consultez Création d'index sur des colonnes calculées.

Notes

Les colonnes calculées utilisées comme colonnes de partitionnement d'une table partitionnée doivent être explicitement conservées.

Les colonnes calculées peuvent être utilisées dans des listes de sélection, des clauses WHERE, des clauses ORDER BY ou à tout autre emplacement où il est possible d'utiliser des expressions, à quelques exceptions :

  • Les colonnes calculées utilisées comme contraintes CHECK, FOREIGN KEY ou NOT NULL doivent être marquées comme PERSISTED. Une colonne calculée peut être utilisée en tant que colonne clé dans un index ou en tant que composante d'une contrainte PRIMARY KEY ou UNIQUE quelconque, si sa valeur est définie par une expression déterministe et si le type de données du résultat est autorisé dans les colonnes d'index.

    Par exemple, si la table contient les colonnes a et b de type entier, la colonne calculée a + b peut être indexée, contrairement à la colonne calculée a + DATEPART(dd, GETDATE()) dont la valeur est susceptible d'évoluer au fil des appels.

  • Une colonne calculée ne peut pas être la cible d'une instruction INSERT ou UPDATE.

Le moteur de base de données détermine automatiquement l'acceptation de valeurs NULL des colonnes calculées en fonction des expressions utilisées. Le résultat de la plupart des expressions est l'autorisation des valeurs NULL, même si seules les colonnes qui n'acceptent pas les valeurs NULL sont présentes, car des dépassements positifs ou négatifs potentiels entraînent également des résultats nuls. Utilisez la fonction COLUMNPROPERTY avec la propriété AllowsNull pour analyser l'acceptation des valeurs NULL de toute colonne calculée contenue dans une table. Une expression pouvant prendre la valeur NULL peut être transformée en expression ne pouvant pas prendre cette valeur, en spécifiant ISNULL (check_expression**,**constant), où la constant est une valeur non nulle substituée à n'importe quel résultat nul.