テーブルは作りたくないけど、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で確保した領域を解放します。