テーブルの計算列の指定Specify Computed Columns in a Table

適用対象: ○SQL Server (2016 以降) ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2016) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

計算列は、PERSISTED とマークされていない限り、テーブルに物理的に保存されない仮想列です。A computed column is a virtual column that is not physically stored in the table, unless the column is marked PERSISTED. 計算列の式は、他の列のデータを使用して値を計算し、それを自身の列に格納します。A computed column expression can use data from other columns to calculate a value for the column to which it belongs. SQL Server 2017SQL Server 2017 上では、 [SQL Server Management Studio]SQL Server Management Studio または Transact-SQLTransact-SQLを使用して計算列に式を指定できます。You can specify an expression for a computed column in SQL Server 2017SQL Server 2017 by using [SQL Server Management Studio]SQL Server Management Studio or Transact-SQLTransact-SQL.

このトピックの内容In This Topic

はじめにBefore You Begin

制限事項と制約事項Limitations and Restrictions

  • 計算列は、DEFAULT 制約定義または FOREIGN KEY 制約定義として使用したり、NOT NULL 制約定義と共に使用したりすることはできません。A computed column cannot be used as a DEFAULT or FOREIGN KEY constraint definition or with a NOT NULL constraint definition. ただし、計算列の値が決定的な式によって定義され、その結果のデータ型がインデックス列で可能な場合、計算列は、インデックスのキー列として、または任意の PRIMARY KEY 制約または UNIQUE 制約の一部として使用できます。However, if the computed column value is defined by a deterministic expression and the data type of the result is allowed in index columns, a computed column can be used as a key column in an index or as part of any PRIMARY KEY or UNIQUE constraint. たとえば、テーブルに整数型の列 a と b がある場合、計算列 a + b にはインデックスを作成できますが、計算列 a+DATEPART(dd, GETDATE()) にインデックスを作成することはできません。これは、この計算列の値が次以降の呼び出しで変更される可能性があるためです。For example, if the table has integer columns a and b, the computed column a + b may be indexed, but computed column a + DATEPART(dd, GETDATE()) cannot be indexed, because the value might change in subsequent invocations.

  • 計算列を INSERT ステートメントまたは UPDATE ステートメントの対象にすることはできません。A computed column cannot be the target of an INSERT or UPDATE statement.

セキュリティSecurity

PermissionsPermissions

テーブルに対する ALTER 権限が必要です。Requires ALTER permission on the table.

SQL Server Management Studio の使用Using SQL Server Management Studio

新しい計算列を追加するにはTo add a new computed column

  1. オブジェクト エクスプローラーで、新しい計算列を追加するテーブルを展開します。In Object Explorer, expand the table for which you want to add the new computed column. [列] を右クリックして [新しい列] をクリックします。Right-click Columns and select New Column.

  2. 列名を入力し、既定のデータ型 (nchar(10)) をそのまま使用します。Enter the column name and accept the default data type (nchar(10)). データベース エンジンDatabase Engine により、計算列のデータ型は、数式で指定された式のデータ型のうち優先順位が高い方になります。The データベース エンジンDatabase Engine determines the data type of the computed column by applying the rules of data type precedence to the expressions specified in the formula. たとえば、式で money 型の列と int型の列を参照する場合、 money 型の方が優先順位が高いため、計算列はそのデータ型になります。For example, if the formula references a column of type money and a column of type int, the computed column will be of type money because that data type has the higher precedence. 詳細については、「データ型の優先順位 (Transact-SQL)」を参照してください。For more information, see Data Type Precedence (Transact-SQL).

  3. [列のプロパティ] タブの [計算列の指定] プロパティを展開します。In the Column Properties tab, expand the Computed Column Specification property.

  4. [(数式)] 子プロパティで、列の式を右側のグリッド セルに入力します。In the (Formula) child property, enter the expression for this column in the grid cell to the right. たとえば、 SalesTotal 列に SubTotal+TaxAmt+Freightという数式を入力した場合、テーブル内の各行のこれらの列の値が加算されます。For example, in a SalesTotal column, the formula you enter might be SubTotal+TaxAmt+Freight, which adds the value in these columns for each row in the table.

    重要

    数式でデータ型が異なる 2 つの式を結合すると、データ型の優先順位の規則によって、優先順位の低いデータ型を優先順位の高いデータ型に変換することが指定されます。When a formula combines two expressions of different data types, the rules for data type precedence specify that the data type with the lower precedence is converted to the data type with the higher precedence. 暗黙的な変換がサポートされていない場合は、「Error validating the formula for column column_name.」というエラーが返されます。If the conversion is not a supported implicit conversion, the error "Error validating the formula for column column_name." is returned. データ型の競合を解決するには、CAST 関数または CONVERT 関数を使用します。Use the CAST or CONVERT function to resolve the data type conflict. たとえば、 nvarchar 型の列を int型の列と結合する場合は、この数式 のように、整数型を nvarchar ('Prod'+CONVERT(nvarchar(23),ProductID))に変換する必要があります。For example, if a column of type nvarchar is combined with a column of type int, the integer type must be converted to nvarchar as shown in this formula ('Prod'+CONVERT(nvarchar(23),ProductID)). 詳細については、「CAST および CONVERT (Transact-SQL)」を参照してください。For more information, see CAST and CONVERT (Transact-SQL).

  5. [Is Persisted] 子プロパティのドロップダウンの [はい] または [いいえ] をクリックし、データを永続化するかどうかを指定します。Indicate whether the data is persisted by choosing Yes or No from the drop-down for the Is Persisted child property.

  6. ファイル メニューの table nameの保存_をクリックします。On the File menu, click Save_table name.

既存の列に計算列の定義を追加するにはTo add a computed column definition to an existing column

  1. オブジェクト エクスプローラーで、変更する列が含まれているテーブルを右クリックし、 [列] フォルダーを展開します。In Object Explorer, right-click the table with the column for which you want to change and expand the Columns folder.

  2. 計算列の数式を指定する列を右クリックし、 [削除] をクリックします。Right-click the column for which you want to specify a computed column formula and click Delete. [OK] をクリックします。Click OK.

  3. 前の手順に従って、新しい列を追加し、計算列の数式を指定して、新しい計算列を追加します。Add a new column and specify the computed column formula by following the previous procedure to add a new computed column.

Transact-SQL の使用Using Transact-SQL

テーブルの作成時に計算列を追加するにはTo add a computed column when creating a table

  1. データベース エンジンDatabase Engineに接続します。Connect to the データベース エンジンDatabase Engine.

  2. [標準] ツール バーの [新しいクエリ] をクリックします。From the Standard bar, click New Query.

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。Copy and paste the following example into the query window and then click Execute. この例では、 QtyAvailable 列の値と UnitPrice 列の値を乗算する計算列を含むテーブルを作成します。The example creates a table with a computed column that multiplies the value in the QtyAvailable column times the value in the UnitPrice column.

    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;  
    

既存のテーブルに新しい計算列を追加するにはTo add a new computed column to an existing table

  1. データベース エンジンDatabase Engineに接続します。Connect to the データベース エンジンDatabase Engine.

  2. [標準] ツール バーの [新しいクエリ] をクリックします。From the Standard bar, click New Query.

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。Copy and paste the following example into the query window and then click Execute. 次の例では、前の例で作成したテーブルに新しい列を追加します。The following example adds a new column to the table created in the previous example.

    ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.35);  
    

既存の列を計算列に変更するにはTo change an existing column to a computed column

  1. データベース エンジンDatabase Engineに接続します。Connect to the データベース エンジンDatabase Engine.

  2. [標準] ツール バーの [新しいクエリ] をクリックします。From the Standard bar, click New Query.

  3. 既存の列を計算列に変更するには、計算列を削除してから再作成する必要があります。To change an existing column to a computed column you must drop and re-create the computed column. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。Copy and paste the following example into the query window and then click Execute. 次の例では、前の例で追加した列を変更します。The following example modifies the column added in the previous example.

    ALTER TABLE dbo.Products DROP COLUMN RetailValue;  
    GO  
    ALTER TABLE dbo.Products ADD RetailValue AS (QtyAvailable * UnitPrice * 1.5);  
    

    詳細については、「ALTER TABLE (Transact-SQL)」を参照してください。For more information, see ALTER TABLE (Transact-SQL).