テーブルの計算列の指定
計算列は、PERSISTED とマークされていない限り、テーブルに物理的に保存されない仮想列です。 計算列の式は、他の列のデータを使用して値を計算し、それを自身の列に格納します。 SQL Server Management Studioまたは Transact-SQL を使用して、SQL Server 2014 の計算列の式を指定できます。
このトピックの内容
作業を開始する準備:
計算列を指定する方法:
はじめに
制限事項と制約事項
計算列は、DEFAULT 制約定義または FOREIGN KEY 制約定義として使用したり、NOT NULL 制約定義と共に使用したりすることはできません。 ただし、計算列の値が決定的な式によって定義され、その結果のデータ型がインデックス列で可能な場合、計算列は、インデックスのキー列として、または任意の PRIMARY KEY 制約または UNIQUE 制約の一部として使用できます。 たとえば、テーブルに整数型の列 a と b がある場合、計算列 a + b にはインデックスを作成できますが、計算列 a+DATEPART(dd, GETDATE()) にインデックスを作成することはできません。これは、この計算列の値が次以降の呼び出しで変更される可能性があるためです。
計算列を INSERT ステートメントまたは UPDATE ステートメントの対象にすることはできません。
セキュリティ
アクセス許可
テーブルに対する 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
型の列と結合する場合は、この数式('Prod'+CONVERT(nvarchar(23),ProductID))
のように、整数型をnvarchar
に変換する必要があります。 詳細については、「 CAST および CONVERT (Transact-SQL)」を参照してください。[Is Persisted] 子プロパティのドロップダウンの [はい] または [いいえ] をクリックし、データを永続化するかどうかを指定します。
[ファイル] メニューの [<テーブル名> を保存] をクリックします。
既存の列に計算列の定義を追加するには
オブジェクト エクスプローラーで、変更する列が含まれているテーブルを右クリックし、 [列] フォルダーを展開します。
計算列の数式を指定する列を右クリックし、 [削除]をクリックします。 [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;
既存のテーブルに新しい計算列を追加するには
データベース エンジンに接続します。
[標準] ツール バーの [新しいクエリ] をクリックします。
次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。 次の例では、前の例で作成したテーブルに新しい列を追加します。
ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.35);
既存の列を計算列に変更するには
データベース エンジンに接続します。
[標準] ツール バーの [新しいクエリ] をクリックします。
既存の列を計算列に変更するには、計算列を削除してから再作成する必要があります。 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。 次の例では、前の例で追加した列を変更します。
ALTER TABLE dbo.Products DROP COLUMN RetailValue; GO ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5);
詳細については、「ALTER TABLE (Transact-SQL)」を参照してください。