テーブルの計算列の指定

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

計算列は、PERSISTED とマークされていない限り、テーブルに物理的に格納されない仮想列です。 計算列の式は、他の列のデータを使用して値を計算し、それを自身の列に格納します。 SQL Server では、SQL Server Management Studio (SSMS) または Transact-SQL (T-SQL) を使用して計算列に式を指定できます。

制限事項と制約事項

  • 計算列は、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 の使用 [SQL Server]

新しい計算列を追加するには

  1. オブジェクト エクスプローラーで、新しい計算列を追加するテーブルを展開します。 [列] を右クリックして [新しい列]をクリックします。

  2. 列名を入力し、既定のデータ型 (nchar(10)) をそのまま使用します。 データベース エンジン により、計算列のデータ型は、数式で指定された式のデータ型のうち優先順位が高い方になります。 たとえば、式で money 型の列と int型の列を参照する場合、 money 型の方が優先順位が高いため、計算列はそのデータ型になります。 詳細については、「データ型の優先順位 (Transact-SQL)」を参照してください。

  3. [列のプロパティ] タブの [計算列の指定] プロパティを展開します。

  4. [(数式)] 子プロパティで、列の式を右側のグリッド セルに入力します。 たとえば、 SalesTotal 列に SubTotal+TaxAmt+Freightという数式を入力した場合、テーブル内の各行のこれらの列の値が加算されます。

    重要

    数式でデータ型が異なる 2 つの式を結合すると、データ型の優先順位の規則によって、優先順位の低いデータ型を優先順位の高いデータ型に変換することが指定されます。 暗黙的な変換がサポートされていない場合は、「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. 計算列の数式を指定する列を右クリックし、[削除]を選択します。 [OK] を選択します。
  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

次のステップ