テーブルの計算列を指定する
適用対象: SQL Server
Azure SQL データベース
Azure 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 を使用します。
新しい計算列を追加する
オブジェクト エクスプローラーで、新しい計算列を追加するテーブルを展開します。 [列] を右クリックして [新しい列]をクリックします。
列名を入力し、既定のデータ型 (nchar(10)) をそのまま使用します。 データベース エンジン により、計算列のデータ型は、数式で指定された式のデータ型のうち優先順位が高い方になります。 たとえば、式で money 型の列と int型の列を参照する場合、 money 型の方が優先順位が高いため、計算列はそのデータ型になります。 詳細については、「データ型の優先順位 (Transact-SQL)」を参照してください。
[列のプロパティ] タブの [計算列の指定] プロパティを展開します。
[(数式)] 子プロパティで、列の式を右側のグリッド セルに入力します。 たとえば、
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)」を参照してください。[永続化された] 子プロパティのドロップダウンから [はい] または [いいえ] を選択し、データを永続化するかどうかを指定します。
[ファイル] メニューの [<テーブル名> を保存] を選択します。
既存の列に計算列の定義を追加する
- オブジェクト エクスプローラーで、変更する列が含まれているテーブルを右クリックし、 [列] フォルダーを展開します。
- 計算列の数式を指定する列を右クリックし、[削除]を選択します。 [OK] を選択します。
- 前の手順に従って、新しい列を追加し、計算列の数式を指定して、新しい計算列を追加します。
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