指定資料表中的計算資料行

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

計算資料行是一個虛擬資料行,並未實際儲存在資料表中,除非該資料行標示為 PERSISTED。 計算資料行運算式可以使用來自其他資料行的資料來計算其所屬資料行的值。 您可以使用 SQL Server Management Studio (SSMS) 或 Transact-SQL (T-SQL),在 SQL Server 中指定計算資料行的運算式。

限制事項

  • 計算資料行不能用來做為 DEFAULT 或 FOREIGN KEY 條件約束定義,也不能搭配 NOT NULL 條件約束定義來使用。 不過,如果計算資料行值是由具決定性的運算式所定義,且索引資料行接受結果的資料類型,計算資料行便可用來做為索引中的索引鍵資料行,也可用在任何 PRIMARY KEY 或 UNIQUE 條件約束中。 例如,如果資料表有整數資料行 a 和 b,您可以建立計算資料行 a + b 的索引,但不能建立計算資料行 a +DATEPART(dd, GETDATE()) 的索引,因為在後續叫用時,值可能會改變。
  • 計算資料行不能是 INSERT 或 UPDATE 陳述式的目標。
  • 當要建立或變更計算資料行上的索引或索引檢視表時,SET QUOTED_IDENTIFIER 必須為 ON。 如需詳細資訊,請參閱 SET QUOTED_IDENTIFIER (Transact-SQL)

權限

需要資料表的 ALTER 權限。

使用 SQL Server Management Studio

若要加入新的計算資料行

  1. [物件總管]中,展開要在其中加入新的計算資料行的資料表。 以滑鼠右鍵按一下 [資料行],然後選取 [新增資料行]

  2. 輸入資料行名稱並接受預設資料類型 (nchar(10))。 資料庫引擎會判斷計算資料行的資料類型,方法是將資料類型優先順序規則套用至公式中指定的運算式。 例如,如果公式參考 money 類型的資料行以及 int類型的資料行,則計算資料行會是 money 類型,因為該資料類型的優先順序較高。 如需詳細資訊,請參閱資料類型優先順序 (Transact-SQL)

  3. [資料行屬性] 索引標籤中,展開 [計算資料行規格] 屬性。

  4. 在 [(Formula)] 子屬性右邊的方格資料格中,輸入此資料行的運算式。 例如,在 SalesTotal 資料行中,您輸入的公式可能是 SubTotal+TaxAmt+Freight,該公式會將資料表中每一個資料列的這些資料行中的值相加。

    重要

    當一個公式結合兩個不同資料類型的運算式時,資料類型優先順序的規則,會指定將低優先順序的資料類型,轉換為高優先順序的資料類型。 如果轉換不是支援的隱含轉換,就會傳回錯誤 Error validating the formula for column column_name.。 使用 CAST 或 CONVERT 函數解決資料類型衝突。 例如,如果 nvarchar 類型的資料行與 int類型的資料行結合,則整數類型必須轉換為 nvarchar ,如 ('Prod'+CONVERT(nvarchar(23),ProductID))這個公式所示。 如需詳細資訊,請參閱 CAST 和 CONVERT (Transact-SQL)

  5. 藉由從 [Is Persisted] 子屬性的下拉式清單中選擇 [是] 或 [否],指示資料是否為永續性。

  6. 在 [檔案] 功能表上,選取 [儲存資料表名稱]。

若要將計算資料行定義新增至現有資料行

  1. 在物件總管中,以滑鼠右鍵按一下包含您要變更之資料行的資料表,然後展開 [資料行] 資料夾。
  2. 以滑鼠右鍵按一下要指定其計算資料行公式的資料行,然後選取 [刪除]。 選取 [確定]。
  3. 加入新的資料行,並依照上述程序加入新的計算料行,藉此指定計算資料行公式。

使用 Transact-SQL

建立資料表時加入計算資料行

下列範例會建立包含計算資料行的資料表,該計算資料行將 QtyAvailable 資料行的值乘 UnitPrice 資料行的值。

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;

-- Update values in the table.
UPDATE dbo.Products 
SET UnitPrice = 2.5
WHERE ProductID = 1;

-- Display the rows in the table, and the new values for UnitPrice and InventoryValue.
SELECT ProductID, QtyAvailable, UnitPrice, InventoryValue
FROM dbo.Products;

若要將新的計算資料行加入至現有資料表

下列範例會將新的資料行加入至上一個範例中建立的資料表。

ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5);

可以選擇新增 PERSISTED 引數,將計算的值實際儲存在資料表中:

ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5) PERSISTED;

若要將現有的資料行變更為計算資料行

下列範例會修改上一個範例中加入的資料行。

ALTER TABLE dbo.Products DROP COLUMN RetailValue;
GO

ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5);
GO

下一步