-
計算列
鎖定
- 中文名
- 計算列
- 外文名
- Computed Columns
- 性 質
- 計算機
- 類 別
- 數據庫
- 應用範圍
- 選擇列表等
計算列簡介
【SQL Server】
例如,在 AdventureWorks 示例數據庫中,Sales.SalesOrderHeader 表的 TotalDue 列具有以下定義:TotalDue AS Subtotal + TaxAmt + Freight。
除非另行指定,否則計算列是未實際存儲在表中的虛擬列。每當在查詢中引用計算列時,都將重新計算它們的值。數據庫引擎在 CREATE TABLE 和 ALTER TABLE 語句中使用 PERSISTED 關鍵字來將計算列實際存儲在表中。如果在計算列的計算更改時涉及任何列,將更新計算列的值。通過將計算列標記為 PERSISTED,可以對具有確定性但不精確的計算列創建索引。另外,如果計算列引用 CLR 函數,則數據庫引擎不能驗證該函數是否真正具有確定性。在這種情況下,計算列必須為 PERSISTED,以便可對其創建索引。
計算列應用範圍
計算列可用於選擇列表、WHERE 子句、ORDER BY 子句或任何可使用正則表達式的其他位置,但下列情況除外:
用作 CHECK、FOREIGN KEY 或 NOT NULL 約束的計算列必須標記為 PERSISTED。如果計算列的值由具有確定性的表達式定義,並且索引列中允許使用計算結果的數據類型,則可將該列用作索引中的鍵列,或者用作 PRIMARY KEY 或 UNIQUE 約束的一部分。
例如,如果表中含有整數列 a 和 b,則可以對計算列 a + b 創建索引,但不能對計算列 a + DATEPART(dd, GETDATE()) 創建索引,因為在後續調用中,其值可能發生改變。
計算列不能作為 INSERT 或 UPDATE 語句的目標。
數據庫引擎基於使用的表達式自動確定計算列的為 Null 性。即使只有非空列,大多數表達式的結果也“認為”可為空值,因為下溢或溢出生成的結果也可能為空。使用帶 AllowsNull 屬性的 COLUMNPROPERTY 函數可查明表中任何計算列的為 Null 性。通過指定 ISNULL (check_expression, constant) 可以將可為空值的表達式轉換為不可為空值的表達式,其中, constant 是可替換所有空結果的非空值.
例子:
CREATE TABLE dbo.Products
(
ProductID int IDENTITY (1,1) NOT NULL
, QtyAvailable smallint
, UnitPrice money
, InventoryValue AS QtyAvailable * UnitPrice
);
-- Insert values into the table.
INSERT INTO dbo.Products (QtyAvailable, UnitPrice)
VALUES (25, 2.00), (10, 1.5);
-- Display the rows in the table.
SELECT ProductID, QtyAvailable, UnitPrice, InventoryValue
FROM dbo.Products;
ALTER TABLE dbo.Products DROP COLUMN RetailValue;
GO
ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5);