プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

【SQL Server(連載)】一時テーブル -30-

www.pon-x.jp

前回の続き

今回は、一時テーブルの扱い方について説明します。

一時テーブル

その処理の中において、仮想にデータを保持したいときに扱うのが、一時テーブルです。
一時テーブルは実際にはテーブルを作成せず(実際は tempdbに作成される)に、その処理の中で一時的に作られるテーブルを言います。

一時テーブルは、同一セッション内ののみ有効な「ローカル一時テーブル」と、その他のセッションでも引き継がれるな「グローバル一時テーブル」があり、作り方が異なります。

ローカル一時テーブル

ローカル一時テーブルは、テーブル名の先頭に#をつけます。
例えばこんな感じです。

CREATE TABLE #TEMP_TABLE(
    NUM INT,
    TXT NVARCHAR(10)
)

では、作成した一時テーブルを参照してみましょう。
SSMSで別のタブを開いて以下のSQLを実行してみてください。

SELECT * FROM #TEMP_TABLE

以下の通りエラー表示になり出力はできません。 f:id:hanabusa-snow:20201215085912p:plain

グローバル一時テーブル

グローバル一時テーブルは、テーブル名の先頭に##をつけます。
例えばこんな感じです。

CREATE TABLE ##TEMP_TABLE(
    NUM INT,
    TXT NVARCHAR(10)
)

では、また作成した一時テーブルを参照してみましょう。
SSMSで別のタブを開いて以下のSQLを実行してみてください。

SELECT * FROM ##TEMP_TABLE

以下の通りセッションをまたいでも出力できることが確認できました。
f:id:hanabusa-snow:20201215090315p:plain

一時テーブルの削除

通常のテーブル同様に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の累乗のデータを追加した一時テーブルを作成します。
作成毎に値が変わるので、試してみてください。

こんなかんじ。 f:id:hanabusa-snow:20201215091934p:plain







以上、今回はここまで