計算列

計算列は、同じテーブルの他の列を使用する式から計算されます。非計算列の名前、定数、関数、およびこれらを 1 つ以上の演算子によって結合した組み合わせを式にすることができます。サブクエリを式にすることはできません。

たとえば、AdventureWorks サンプル データベースでは、Sales.SalesOrderHeader テーブルの TotalDue 列は、TotalDue AS Subtotal + TaxAmt + Freight と定義されています。

特に指定がない限り、計算列は物理的にテーブルに格納されない仮想列です。クエリで参照されるたびに値が再計算されます。データベース エンジンでは、計算列をテーブルに物理的に格納するために、CREATE TABLE ステートメントや ALTER TABLE ステートメントで PERSISTED キーワードを使用します。この場合、計算の一部である列が変更されると値が更新されます。計算列を PERSISTED に設定することにより、決定的であっても正確ではない計算列にインデックスを作成できます。また、計算列が CLR 関数を参照している場合、データベース エンジンは関数が実際に決定的であるかどうかを確認できません。この場合に、インデックスを作成できるようにするために、計算列を PERSISTED に設定する必要があります。詳細については、「計算列に対するインデックスの作成」を参照してください。

注意注意

パーティション テーブルのパーティション分割列として使用される計算列は、明示的に PERSISTED に設定する必要があります。

計算列は、選択リスト、WHERE 句、ORDER BY 句、その他標準式が使用できる任意の位置で使用できます。ただし、次の場合は除きます。

  • CHECK 制約、FOREIGN KEY 制約、または NOT NULL 制約として使用される計算列は、PERSISTED に設定する必要があります。計算列の値が決定的な式によって定義され、その結果のデータ型がインデックス列で許可される場合、計算列は、インデックスのキー列として、または任意の PRIMARY KEY 制約や UNIQUE 制約の一部として使用できます。

    たとえば、テーブルに整数列 ab がある場合、計算列 a + b にはインデックスを作成できますが、計算列 a + DATEPART(dd, GETDATE()) にインデックスを作成することはできません。これは、この計算列の値がその後の呼び出しで変更される可能性があるためです。

  • 計算列を INSERT ステートメントまたは UPDATE ステートメントの対象にすることはできません。

計算列の NULL 値の許容は、使用される式に基づいてデータベース エンジンによって自動的に決められます。NULL 値を許容しない列しか存在しない場合でも、ほとんどの式の結果は NULL 値を許容すると考えられます。これは、アンダーフローやオーバーフローによって結果が NULL 値になる場合があるためです。テーブルの任意の計算列で NULL 値が許容されるかどうかを調べるには、AllowsNull プロパティを指定して COLUMNPROPERTY 関数を使用します。ISNULL(check_expression**,**constant) を指定することにより、NULL 値が許容される式を、NULL 値が許容されない式に変更できます。constant は結果が NULL の場合に代わりに設定される NULL 以外の値です。