table (Transact-SQL)

後で処理するために結果セットを格納するときに使用する特別なデータ型です。table は主に、テーブル値関数の結果セットとして返される、行のセットの一時的な格納場所として使用します。

注意注意

table 型の変数を宣言するには、DECLARE @local_variable を使用します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文


table_type_definition ::= 
    TABLE ( { column_definition | table_constraint } [ ,...n ] ) 

column_definition ::= 
        column_name scalar_data_type 
    [ COLLATE collation_definition ] 
    [ [ DEFAULT constant_expression ] | IDENTITY [ ( seed , increment ) ] ] 
    [ ROWGUIDCOL ] 
    [ column_constraint ] [ ...n ] 

column_constraint ::= 
    { [ NULL | NOT NULL ] 
    | [ PRIMARY KEY | UNIQUE ] 
    | CHECK ( logical_expression ) 
    } 

table_constraint ::= 
     { { PRIMARY KEY | UNIQUE } ( column_name [ ,...n ] )
     | CHECK ( logical_expression ) 
     } 

引数

  • table_type_definition
    CREATE TABLE でテーブルを定義するために使用する情報のサブセットと同じです。テーブルの定義には、列の定義、名前、データ型、および制約が含まれます。許可される制約の種類は、PRIMARY KEY、UNIQUE KEY、および NULL だけです。

    これらの構文の詳細については、「CREATE TABLE (Transact-SQL)」、「CREATE FUNCTION (Transact-SQL)」、および「DECLARE @local\_variable (Transact-SQL)」を参照してください。

  • collation_definition
    Microsoft Windows ロケールと比較形式、Windows ロケールとバイナリ表記から構成される列の照合順序、または MicrosoftSQL Server 照合順序です。collation_definition を指定しない場合は、現在のデータベースの照合順序が列に継承されます。または、列が共通言語ランタイム (CLR) ユーザー定義型として定義されている場合は、ユーザー定義型の照合順序が列に継承されます。

説明

関数および変数は、table 型として宣言できます。table 変数は、関数、ストアド プロシージャ、およびバッチ内で使用できます。

重要な注意事項重要

table 変数を変更するクエリは、並列クエリの実行プランを生成しません。非常に大きな table 変数、または複雑なクエリ内の table を変更する場合は、パフォーマンスに影響が生じることがあります。このような場合は、代わりに一時テーブルを使用することを検討してください。詳細については、「CREATE TABLE (Transact-SQL)」を参照してください。table 変数を変更せずに読み取るクエリは並列処理できます。

table 変数には、次のような利点があります。

  • table 変数は、ローカル変数のように機能します。この変数には適切に定義されたスコープがあります。スコープは、それが宣言されている関数、ストアド プロシージャ、またはバッチです。

    table 変数は、そのスコープの中で、通常のテーブルのように使用できます。また、SELECT、INSERT、UPDATE、および DELETE の各ステートメントで、テーブルまたはテーブル式が使用されている任意の場所で適用できます。ただし、table は、以下のステートメントでは使用できません。

    SELECT select_list INTO table_variable   
    

    table 変数は、それが定義されている関数、ストアド プロシージャ、またはバッチの終了時に自動的に削除されます。

  • table 型宣言の CHECK 制約、DEFAULT 値および計算列は、ユーザー定義関数を呼び出すことができません。

  • ストアド プロシージャで table 変数を使用すると、ストアド プロシージャの再コンパイルの回数が、一時テーブルを使用した場合よりも少なくなります。

  • table 変数を使用するトランザクションは、table 変数に対する更新の実行中のみ有効です。したがって、table 変数を使用すると、ロックおよびログで必要なリソースが少なくて済みます。

table 変数ではインデックスを明示的に作成することができず、統計が保持されません。場合によっては、インデックスと統計をサポートする一時テーブルを使用した方がパフォーマンスが向上する場合があります。一時テーブルの詳細については、「CREATE TABLE (Transact-SQL)」を参照してください。

以下の例に示すように、table 変数は、バッチの FROM 句の名前により参照できます。

SELECT Employee_ID, Department_ID FROM @MyTableVar

FROM 句以外では、以下に示すように table 変数は別名を使用して参照する必要があります。

SELECT EmployeeID, DepartmentID 
FROM @MyTableVar m
JOIN Employee on (m.EmployeeID =Employee.EmployeeID AND
   m.DepartmentID = Employee.DepartmentID)

table 変数間における代入操作はサポートされていません。さらに、table 変数は、限られたスコープを持ち、かつ、持続性のあるデータベースの一部ではないため、トランザクション ロールバックには影響されません。