計算的資料行

計算的資料行是使用相同資料表中其他資料行的運算式所計算而得。這個運算式可以是非計算的資料行名稱、常數、函數,以及一或多個運算子所連接的這些項目的任何組合。運算式不可以是子查詢。

例如,在 AdventureWorks2008R2 範例資料庫中,Sales.SalesOrderHeader 資料表的 TotalDue 資料行定義:TotalDue AS Subtotal + TaxAmt + Freight

除非另有指定,否則計算的資料行是虛擬資料行,並非實體儲存在資料表中。每次在查詢中參考它們的值時,才重新計算。「Database Engine」在 CREATE TABLE 和 ALTER TABLE 陳述式中使用 PERSISTED 關鍵字時,可將計算的資料行實體儲存在資料表中。當計算中的任何資料行變更時,就會更新它們的值。將計算的資料行標示為 PERSISTED,就可以在決定性但非精確的計算資料行上建立索引。此外,如果計算的資料行參考 CLR 函數,「Database Engine」就無法確定函數是否真的是決定性的。此時,計算的資料行必須是 PERSISTED,索引才能在它上面建立。如需詳細資訊,請參閱<在計算資料行上建立索引>。

[!附註]

任何用來作為分割資料表之分割資料行的計算資料行,必須明確被保存。

計算資料行可以用在選取清單、WHERE 子句、ORDER BY 子句、或任何其他可以使用規則運算式的位置,除了以下的例外情形:

  • 計算的資料行用來作為 CHECK、FOREIGN KEY 或 NOT NULL 條件約束時必須標示為 PERSISTED。如果以決定性的運算式定義計算資料行的值,並且索引資料行允許結果的資料類型,則計算資料行可以用來作為索引的索引鍵資料行,或任何 PRIMARY KEY 或 UNIQUE 條件約束的一部份。

    例如,如果資料表具有整數資料行 ab,計算的資料行 a + b 可以作為索引,但計算的資料行 a + DATEPART(dd, GETDATE()) 無法作為索引,因為在後續的呼叫中其值可能會改變。

  • 計算的資料行無法成為 INSERT 或 UPDATE 陳述式的目標。

「Database Engine」會根據使用的運算式自動決定計算的資料行是否為 Null 屬性。即使存在的都是非 Null 的資料行,大部份運算式的結果會視為允許 Null,因為反向溢位 (underflow) 或溢位也都會產生 Null 的結果。使用這個 COLUMNPROPERTY 函數搭配 AllowsNull 屬性來研究資料表中任何計算的資料行的 Null 屬性。您可以指定 ISNULL (check_expression**,**constant),將可為 Null 的運算式變成不允許為 Null,其中 constant 是用來替代任何 NULL 結果的非 Null 值。