テーブルは作りたくないけど、SQLの実行中だけ一時的に退避させておくテーブルが欲しい、


テーブル内のデータのコピーをとり、コピーで加工がしたい等の永続的ではなく一時的にテーブルを利用したい場合に一時テーブルを利用します。


一時テーブル以外にも変数テーブルもある。・・・が今回は一時テーブルについて書きます。


まずはソースから


-- 一時テーブルの作成
CREATE TABLE #TemporaryTable (
  tid INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
  memo1 VARCHAR(255),
  memo2 VARCHAR(255)
)

-- 一時テーブルにデータを追加
INSERT INTO #TemporaryTable(memo1) 
values('INSERTED ' + cast(getdate() as varchar(255)))
INSERT INTO #TemporaryTable(memo1) 
values('INSERTED ' + cast(getdate() as varchar(255)))
INSERT INTO #TemporaryTable(memo1) 
values('INSERTED ' + cast(getdate() as varchar(255)))

-- 格納域
declare @tid int

-- カーソル宣言
declare temp_cursor cursor fast_forward for
SELECT tid FROM #TemporaryTable

-- カーソルオープン
open temp_cursor

-- カーソル移動
fetch next from temp_cursor into @tid

-- カーソルが読み取れなくなるまで
while (@@fetch_status = 0)
begin
  -- 取得したtidでデータ更新
  update #TemporaryTable 
  set 
    memo2=
    '[ ' + cast(@tid as varchar(255)) 
    + ' ] 回目のINSERT結果です。' 
  where tid=@tid
  -- カーソル移動
  fetch next from temp_cursor into @tid
end

-- カーソルを閉じる
close temp_cursor
-- カーソルを解放
deallocate temp_cursor

-- 追加、更新したテーブルを表示
select * from #TemporaryTable

-- 必要なくなった一時テーブルを削除
drop table #TemporaryTable




これをクエリアナライザ等で実行すれば実行されます。


しかもテーブルは残りません。


普通のCREATE TABLEと文法は同様です。唯一違うのはテーブル名の前に”#”が付いていることです。


これはローカル一時テーブルといい、作成した人のみが利用可能です。


よって、セッションを分ければ同名のテーブルが作成可能です。


またセッションがなくなればテーブルも削除されます。


”##”が二つ付いているとグローバル一時テーブルといいます。


この場合は、全部のセッションで共通して利用が可能になります。


よって、他のセッションで作成されている場合は同名のテーブルの作成は不可能です。


アクセスしている全セッションがなくなりますと、テーブルも削除されます。


カーソルに関しましては、declareでカーソルを作成します。


fast_forwardと記載されている箇所は、カーソルの種類を指定してます。


次に、カーソルで開くためのSQL文を記載します。


定義が完了したら、openで開き、fetchで取得し、closeで閉じます。


最後に、deallocateで確保した領域を解放します。