共用方式為


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

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

本主題內容

  • 開始之前:

    限制事項

    安全性

  • 若要使用下列項目來指定計算資料行:

    SQL Server Management Studio

    Transact-SQL

開始之前

限制事項

  • 計算資料行不能用來做為 DEFAULT 或 FOREIGN KEY 條件約束定義,也不能搭配 NOT NULL 條件約束定義來使用。 不過,如果計算資料行值是由具決定性的運算式所定義,且索引資料行接受結果的資料類型,計算資料行便可用來做為索引中的索引鍵資料行,也可用在任何 PRIMARY KEY 或 UNIQUE 條件約束中。 例如,如果資料表有整數資料行 a 和 b,您可以建立計算資料行 a + b 的索引,但不能建立計算資料行 a +DATEPART(dd, GETDATE()) 的索引,因為在後續叫用時,值可能會改變。

  • 計算資料行不能是 INSERT 或 UPDATE 陳述式的目標。

安全性

權限

需要資料表的 ALTER 權限。

搭配回到頁首連結使用的箭頭圖示[回到頁首]

使用 SQL Server Management Studio

若要加入新的計算資料行

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

  2. 輸入資料行名稱並接受預設資料類型 (nchar(10))。 Database Engine 會判斷計算資料行的資料類型,方法是將資料類型優先順序規則套用至公式中指定的運算式。 例如,如果公式參考 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. 按一下 [檔案] 功能表上的 [儲存 table name]

搭配回到頁首連結使用的箭頭圖示[回到頁首]

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

  1. [物件總管] 中,以滑鼠右鍵按一下包含您要變更之資料行的資料表,然後展開 [資料行] 資料夾。

  2. 以滑鼠右鍵按一下要指定其計算資料行公式的資料行,然後按一下 [刪除]。 按一下 [確定]。

  3. 加入新的資料行,並依照上述程序加入新的計算料行,藉此指定計算資料行公式。

搭配回到頁首連結使用的箭頭圖示[回到頁首]

使用 Transact-SQL

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

  1. 連接到 Database Engine。

  2. 在標準列中,按一下 [新增查詢]

  3. 將下列範例複製並貼到查詢視窗中,然後按一下 [執行]。 此範例會建立包含計算資料行的資料表,該計算資料行會乘以 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;
    

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

  1. 連接到 Database Engine。

  2. 在標準列中,按一下 [新增查詢]

  3. 將下列範例複製並貼到查詢視窗中,然後按一下 [執行]。 下列範例會將新的資料行加入至上一個範例中建立的資料表。

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

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

  1. 連接到 Database Engine。

  2. 在標準列中,按一下 [新增查詢]

  3. 若要將現有的資料行變更為計算資料行,您必須卸除並重新建立計算資料行。 將下列範例複製並貼到查詢視窗中,然後按一下 [執行]。 下列範例會修改上一個範例中加入的資料行。

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

    如需詳細資訊,請參閱<ALTER TABLE (Transact-SQL)>。

搭配回到頁首連結使用的箭頭圖示[回到頁首]