計算列は、列が 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)」を参照してください。[永続化された子プロパティ] のドロップダウンから [ はい ] または [いいえ ] を選択して、データを 永続化 するかどうかを指定します。
[ファイル] メニューの [<テーブル名> を保存] をクリックします。
計算列の定義を既存の列に追加するには
オブジェクト エクスプローラーで、変更する列が含まれているテーブルを右クリックし、 [列] フォルダーを展開します。
計算列の数式を指定する列を右クリックし、[削除] をクリック します。 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)を参照してください。