複製鏈接
請複製以下鏈接發送給好友

計算列

鎖定
計算列由可以使用同一表中的其他列的表達式計算得來。表達式可以是非計算列的列名、常量、函數,也可以是用一個或多個運算符連接的上述元素的任意組合。表達式不能為子查詢
中文名
計算列
外文名
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 約束的一部分。
例如,如果表中含有整數列 ab,則可以對計算列 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);