sql serverのテンポラリ・テーブル

3056 ワード

テンポラリ・テーブル
ローカル・テンポラリ・テーブルとグローバル・テンポラリ・テーブルを作成できます.ローカル・テンポラリ・テーブルは現在のセッションでのみ表示され、グローバル・テンポラリ・テーブルはすべてのセッションで表示されます.テンポラリ・テーブルはパーティション化できません.
ローカルテンポラリ・テーブルの名前の前に数字記号(#table_name)があり、グローバルテンポラリ・テーブルの名前の前に数字記号(##table_name)が2つあります.
SQL文CREATE TABLE文でtable_を使用nameで指定した値は、テンポラリ・テーブルを参照します.たとえば、次のようにします.
CREATE TABLE #MyTempTable (cola INT PRIMARY KEY);

            INSERT INTO #MyTempTable VALUES (1);

            

単一のストレージ・プロシージャまたはバッチで複数のテンポラリ・テーブルが作成されている場合は、異なる名前が必要です.
ローカル・テンポラリ・テーブルがストレージ・プロシージャによって作成された場合、または複数のユーザーが同時に実行したアプリケーションによって作成された場合、データベース・エンジンは、異なるユーザーによって作成されたテーブルを区別できる必要があります.このため、データベース・エンジンは内部でローカル・テンポラリ・テーブルのテーブル名ごとにデジタル接尾辞を追加します.tempdbのsysobjectsテーブルに格納されているテンポラリ・テーブルで、CREATE TABLE文で指定されたテーブル名とシステムで生成されたデジタル接尾辞で構成されています.接尾辞の追加を許可するために、ローカル・テンポラリ・テーブルに指定したtable_nameは116文字を超えてはいけません.
DROP TABLEを使用してテンポラリ・テーブルを明示的に削除しない限り、テンポラリ・テーブルは、その役割ドメインを終了するときにシステムによって自動的に削除されます.
  • ストレージ・プロシージャが完了すると、ストレージ・プロシージャで作成されたローカル・テンポラリ・テーブルが自動的に削除されます.テーブルを作成するストアド・プロシージャによって実行されるネストされたストアド・プロシージャはすべてこのテーブルを参照できます.しかし、このテーブルを作成するストレージ・プロシージャを呼び出すプロセスは、このテーブルを参照できません.
  • 他のすべてのローカル・テンポラリ・テーブルは、現在のセッションの終了時に自動的に削除されます.
  • グローバル・テンポラリ・テーブルは、このテーブルを作成するセッションが終了し、他のすべてのタスクが参照を停止すると自動的に削除されます.タスクとテーブルの関連付けは、単一Transact-SQL文の生存期間内にのみ保持されます.すなわち、グローバルテンポラリ・テーブルの作成セッションが終了すると、最後のテーブルを参照するTransact-SQL文が完了すると、このテーブルは自動的に削除されます.

  • ストアド・プロシージャまたはトリガで作成されたローカル・テンポラリ・テーブルの名前は、ストアド・プロシージャまたはトリガを呼び出す前に作成されたテンポラリ・テーブルの名前と同じです.ただし、クエリがテンポラリ・テーブルを参照し、同じ名前のテンポラリ・テーブルが2つある場合、クエリをどのテーブルに対して解析するかは定義されません.ネストされたストレージ・プロシージャは、呼び出されたストレージ・プロシージャが作成したテンポラリ・テーブルと同じ名前のテンポラリ・テーブルを作成することもできます.ただし、ネストされたプロシージャで作成されたテーブルとして解析するために変更するには、呼び出しプロシージャで作成されたテーブルと同じ構造とカラム名を持つ必要があります.次の例では、この点を説明します.
    CREATE PROCEDURE dbo.Test2
    
                AS
    
                CREATE TABLE #t(x INT PRIMARY KEY);
    
                INSERT INTO #t VALUES (2);
    
                SELECT Test2Col = x FROM #t;
    
                GO
    
                CREATE PROCEDURE dbo.Test1
    
                AS
    
                CREATE TABLE #t(x INT PRIMARY KEY);
    
                INSERT INTO #t VALUES (1);
    
                SELECT Test1Col = x FROM #t;
    
                EXEC Test2;
    
                GO
    
                CREATE TABLE #t(x INT PRIMARY KEY);
    
                INSERT INTO #t VALUES (99);
    
                GO
    
                EXEC Test1;
    
                GO
    
                

    次は結果セットです.
    (1 row(s) affected)
    
                Test1Col
    
                -----------
    
                1
    
                (1 row(s) affected)
    
                Test2Col
    
                -----------
    
                2           

    ローカルまたはグローバルテンポラリ・テーブルを作成するとき、CREATE TABLE構文は、FOREGN KEY制約以外のすべての制約定義をサポートします.テンポラリ・テーブルにFOREGN KEY制約が指定されている場合、文は制約がスキップされたことを示す警告メッセージを返します.このテーブルは作成されますが、FOREGN KEYコンストレイントは使用されません.FOREGN KEY制約ではテンポラリ・テーブルは参照できません.
    テンポラリ・テーブルではなく、テーブル変数を使用することをお勧めします.テンポラリ・テーブルにインデックスを明示的に作成する必要がある場合、または複数のストレージ・プロシージャまたは関数がテーブル値を使用する必要がある場合、テンポラリ・テーブルは便利です.通常、テーブル変数は、より効率的なクエリー処理を提供します.詳細については、「
    表(Transact-SQL)
    .
    どうやら私がSBMで使っていたテンポラリ時計が間違っていたようです~