前回の続き
今回は、一時テーブルの扱い方について説明します。
一時テーブル
その処理の中において、仮想にデータを保持したいときに扱うのが、一時テーブルです。
一時テーブルは実際にはテーブルを作成せず(実際は tempdbに作成される)に、その処理の中で一時的に作られるテーブルを言います。
一時テーブルは、同一セッション内ののみ有効な「ローカル一時テーブル」と、その他のセッションでも引き継がれるな「グローバル一時テーブル」があり、作り方が異なります。
ローカル一時テーブル
ローカル一時テーブルは、テーブル名の先頭に#をつけます。
例えばこんな感じです。
CREATE TABLE #TEMP_TABLE( NUM INT, TXT NVARCHAR(10) )
では、作成した一時テーブルを参照してみましょう。
SSMSで別のタブを開いて以下のSQLを実行してみてください。
SELECT * FROM #TEMP_TABLE
以下の通りエラー表示になり出力はできません。
グローバル一時テーブル
グローバル一時テーブルは、テーブル名の先頭に##をつけます。
例えばこんな感じです。
CREATE TABLE ##TEMP_TABLE( NUM INT, TXT NVARCHAR(10) )
では、また作成した一時テーブルを参照してみましょう。
SSMSで別のタブを開いて以下のSQLを実行してみてください。
SELECT * FROM ##TEMP_TABLE
以下の通りセッションをまたいでも出力できることが確認できました。
一時テーブルの削除
通常のテーブル同様にDROPで削除が可能です。
ただし、通常のテーブルと違うのは一時テーブルはあくまで一時つくるもので、処理毎に作成することになるでしょうから、頻繁にテーブルの作成処理が行われることになろうと思います。
その時に、一時テーブルが存在していれば問題なく削除処理ができるのですが、存在しない場合に削除処理を行うとエラーになり以後の処理に至りません。
そこで、一時テーブルを削除する前に、テーブルの存在チェックを行うことをお勧めします。
こんな感じです。
IF OBJECT_ID(N'tempdb..#TEMP_TABLE', N'U') IS NOT NULL DROP TABLE #TEMP_TABLE CREATE TABLE #TEMP_TABLE( NUM INT, TXT NVARCHAR(10) )
これでなんど実行してもエラー出力になることはありません。
以下、適当に一時テーブルで遊んでみました。
IF OBJECT_ID(N'tempdb..#TEMP_TABLE', N'U') IS NOT NULL DROP TABLE #TEMP_TABLE CREATE TABLE #TEMP_TABLE( NUM INT, TXT NVARCHAR(20) ) DECLARE @NUM INT DECLARE @VALUE BIGINT SET @NUM = 1 WHILE @NUM < 10 BEGIN SET @VALUE = POWER(10, @NUM) INSERT INTO #TEMP_TABLE VALUES (RAND() * @VALUE, 'UNDER ' + CONVERT(VARCHAR, @VALUE)) SET @NUM += 1 END SELECT * FROM #TEMP_TABLE
0以上、かつ10の累乗のデータを追加した一時テーブルを作成します。
作成毎に値が変わるので、試してみてください。
こんなかんじ。
以上、今回はここまで