【SQL SERVER】 一時テーブル

一時テーブルについての開発備忘録です。

データ処理を行っている時に、ちょっとした途中加工データを置いて置きたい場合があります。
でも、メモリに置くには大きすぎてという場合も有るし、テーブルに格納するのも排他制御や使用後の削除などの手間も有るのでテーブルは使いたくない。。。
通常のテーブルを使う場合は、固有のプロセスIDを負荷した列を設けて他のプロセスから切り離すなどをしないといけません。
そんな時に使うのが、「一時テーブル」です。一時という名前はついていますが、テーブルアクセスしてSQLで処理できるので楽にデータが扱えます。

一時テーブルは非常に使い勝手良く、ほぼ通常のテーブルと変わらぬ動きをします。
一時テーブルには、PRIMARY KEYを付けたり、Indexを付けたりもできます。
一時テーブルは、tempdb に格納される点と使用されなくなると自動的に削除されるという点を除いて、通常のテーブルと同じです。

一時テーブルには、ローカル一時テーブルとグローバル一時テーブルの2種類があります。
この2種類の一時テーブルでは、名前(#1つか2つかの違い)と表示とアクセス範囲が異なります。

ローカル一時テーブル名の先頭には、番号記号 (#) が1つ付いています。
このテーブルは、作成したユーザーの現在のセッション接続でのみ表示され、このユーザーが SQL Server のインスタンスから切断すると削除されます。
ローカル一時テーブルは、事前に現在のセッション内だけという制約も有り、最初から排他されているので排他処理等の手続きも不要です。
execSQLのように動的にSQLを動かす場合以外は、通常こちらのローカル一時テーブルを使用します。

create table #tmpTable
(
	a_id int NOT NULL
	, b_cd nvarchar(2) NULL
	, c_val nvarchar(10) NULL
)

グローバル一時テーブル名の先頭には、番号記号が2つ (##) 付いています。
このテーブルは、作成されるとすべてのユーザーに表示され、このテーブルを参照するすべてのユーザーが SQL Server のインスタンスから切断すると削除されます。
全てのユーザが使用可能になりますので、予めどのような状態のデータかがはっきりしている必要があります。
execSQLのように同一ユーザが動的にSQLを他のセッションで動かす場合のような単純な使い方であれば使い勝手も良いのですが、それ以外は通常のテーブル使用とあまり変わりません。

create table ##tmpTable
(
	a_id int NOT NULL
	, b_cd nvarchar(2) NULL
	, c_val nvarchar(10) NULL
)

しかし多くの場合、一時テーブルを使用する代わりに、table データ型の変数を使用することができます。table 変数については、変数を使用したテーブルの利用方法を見てください。

以上、一時テーブルについての開発備忘録でした。