Вычисляемые столбцы

Вычисляемый столбец вычисляется на основе выражения, в котором могут использоваться другие столбцы той же таблицы. Выражение может быть именем невычисляемого столбца, константой, функцией или любым их сочетанием, соединенным одним или несколькими операторами. Выражение не может быть вложенным запросом.

Например, в образце базы данных База данных AdventureWorks2008R2 определение столбца TotalDue таблицы Sales.SalesOrderHeader следующее: TotalDue AS Subtotal + TaxAmt + Freight.

Если не указано иное, вычисляемые столбцы являются виртуальными столбцами, которые физически в таблице не хранятся. Их значения вычисляются заново каждый раз при обращении к ним запроса. В компоненте Database Engine для физического хранения вычисляемых столбцов в таблицах используется ключевое слово PERSISTED инструкций CREATE TABLE и ALTER TABLE. Значения столбцов обновляются каждый раз при изменении любых столбцов, входящих в вычисляемое выражение. Пометив вычисляемый столбец как PERSISTED, можно создать на вычисляемом столбце индекс, являющийся детерминистическим, но неточным. Кроме того, если вычисляемый столбец обращается к функции среды CLR, компонент Database Engine не может определить, является ли эта функция подлинно детерминистической. В этом случае вычисляемый столбец необходимо пометить как PERSISTED, чтобы на нем можно было создавать индексы. Дополнительные сведения см. в разделе Создание индексов вычисляемых столбцов.

ПримечаниеПримечание

Все вычисляемые столбцы, используемые в столбцах секционирования секционированной таблицы, должны быть явно помечены как PERSISTED.

Вычисляемые столбцы могут использоваться в списках выборки, предложениях WHERE, ORDER BY и в любых других местах, в которых могут использоваться обычные выражения, за исключением следующих случаев.

  • Вычисляемые столбцы, используемые в качестве ограничений CHECK, FOREIGN KEY или NOT NULL, должны быть помечены как PERSISTED. Вычисляемый столбец может использоваться в качестве ключевого столбца в индексе в качестве компонента какого-либо ограничения PRIMARY KEY или UNIQUE, если значение этого вычисляемого столбца определено детерминистическим выражением, а тип данных результата разрешен в столбцах индекса.

    Например, если в таблице есть целочисленные столбцы a и b, вычисляемый столбец a + b можно проиндексировать, а вычисляемый столбец a+ DATEPART(dd, GETDATE()) проиндексировать нельзя, так как его значение может измениться при последующих вызовах.

  • Вычисляемый столбец не может быть целевым столбцом инструкций INSERT или UPDATE.

Компонент Database Engine автоматически определяет возможность хранения значения NULL вычисляемыми столбцами на основе используемых выражений. Результат большинства выражений может быть равен NULL даже в случае, если присутствуют только столбцы, не допускающие NULL, так как при возможных переполнениях или потерях точности будут выданы результаты с этим значением. Для выяснения возможности хранения значения NULL вычисляемым столбцом в таблице используется функция COLUMNPROPERTY со свойством AllowsNull. Выражение, допускающее NULL, можно превратить в не допускающее с помощью функции ISNULL(check_expression**,**constant), где constant — ненулевое значение, заменяющее любой результат NULL.