SQL Serverでは、一時テーブル スコープ外になるまで存在する特定の種類のテーブルです(明示的に削除されない限り)。
これは、通常の(永続的な)テーブルとは異なります。通常のテーブルは、明示的に削除するまでデータベースに永続的に存在します。
一時テーブルの利点
一時テーブルは、より大きな結果セットのサブセットに対して複数のクエリを実行する必要がある場合に役立ちます。 SELECT... INTO
を使用できます WHERE
を使用 データのサブセットを一時テーブルに入れる句。次に、その一時テーブルに対してクエリを実行できます。これにより、複数のクエリを実行するときに、より大きな結果セットからデータを常にフィルタリングする必要がなくなります。
一時テーブルは、権限の観点からも役立ちます。永続テーブルのデータを操作する必要があるが、必要なすべての操作を実行するための十分な権限がない場合は、そのデータを一時テーブルにコピーして(読み取りアクセス権がある場合)、必要なことをすべて実行できます。 。
現在のデータベースに(永続的な)テーブルを作成する権限がない場合は、一時テーブルを使用することもできます。
一時テーブルのもう1つの便利な側面は、ドロップするのを忘れた永続テーブルの痕跡を残すことを心配せずに、テストの実行時や概念のデモンストレーションなどで、アドホッククエリをすばやく実行するために使用できることです。
TempDB
一時テーブルはTempDBに作成されます データベース。これは、一時テーブルとインデックス、一時ストアドプロシージャ、テーブル変数、テーブル値関数で返されるテーブル、カーソルなどの一時ユーザーオブジェクトを格納するシステムデータベースです。また、データベースエンジンによって作成された内部オブジェクト、およびバージョンストアも格納されます。
すべてのユーザーがTempDBに一時テーブルを作成できます 。 TempDBに特別な権限を設定する必要はありません アクセス。
構文
一時テーブルは、通常のテーブルと同じ構文を使用して作成されます。違いは、一時テーブルの前に1つまたは2つの数字記号(#
)が付いていることです。 ):
- ローカル一時テーブルには、単一の番号記号が接頭辞として付けられます(例:
#table_name
) - グローバル一時テーブルの前には二重の番号記号が付いています(例:
##table_name
)
ローカルの作成例 一時テーブル:
CREATE TABLE #LocalTableName ( col1 int PRIMARY KEY, col2 varchar(255) );
グローバルの作成例 一時テーブル:
CREATE TABLE ##GlobalTableName ( col1 int PRIMARY KEY, col2 varchar(255) );
ローカル一時テーブルは現在のセッションでのみ表示され、グローバル一時テーブルはすべてのセッションで表示されます。
一時的なテーブルはどのくらい続きますか?
一時テーブルは、スコープ外になると自動的に削除されます。
DROP TABLE
を使用して、一時テーブルを明示的に削除することもできます。 。
一時テーブルが自動的に削除されるタイミングは、一時テーブルがローカルかグローバルか、およびストアドプロシージャで作成されたかどうかによって異なります。
- ローカル :ストアドプロシージャで作成されたローカル一時テーブルは、ストアドプロシージャが終了すると自動的に削除されます。テーブルは、テーブルを作成したストアドプロシージャによって実行されるネストされたストアドプロシージャから参照できます。テーブルを作成したストアドプロシージャを呼び出したプロセスがテーブルを参照することはできません。
他のすべてのローカル一時テーブルは、現在のセッションの終了時に自動的に削除されます。
- グローバル :グローバル一時テーブルは、テーブルを作成したセッションが終了し、他のすべてのタスクがそれらの参照を停止すると、自動的に削除されます。タスクとテーブルの間の関連付けは、単一のT-SQLステートメントの存続期間中のみ維持されます。これは、作成セッションが終了したときにテーブルをアクティブに参照していた最後のT-SQLステートメントの完了時に、グローバル一時テーブルが削除されることを意味します。
スキーマ
すべての一時テーブルはdboで作成されます スキーマ。別のスキーマを明示的に指定した場合、それは無視されます。
外部キー
FOREIGN KEY制約は、一時テーブルには適用されません。外部キーを指定した場合でも、外部キーなしでテーブルが作成されます。これを通知するメッセージが返されます。