SQLServerに一時テーブルが存在したらDropしてからCreateする方法

IF EXISTS テーブル名やIF OBJECT_ID(N’#テーブル名, N’U’) IS NOT NULLを使用してDROP及びCREATEする。

SQL Server 2014201620192020

同一セッションですでに一時テーブルを作成している場合、再度テーブル作成クエリを流すとエラーになるので、一時テーブルが存在しているかチェックして、存在する場合はテーブルを削除(DROP)してから作成(Create)します。SQLServerのバージョンが2016より前と以前では方法が異なります。

エラーメッセージ
すでにテーブルが存在している場合、発生するエラーメッセージ

一時テーブルですが、SQL Serverではデータ量が多いテーブルをINNER JOIN句内でサブクエリして結合するとパフォーマンスが悪いので、一時テーブルにサブクエリの検索結果をINSERTして結合することでパフォーマンスが劇的によくなります。

2016よりも前のバージョン

SQLServerバージョンが2016以前の場合は「DROP TALBE IF EXISTS テーブル名」が使用できないため、「OBJECT_ID()」関数を使用して一時テーブルがあるかないか存在チェックします。

OBJECT_ID()は2016以降のバージョンでも使用できます。

/* 一時テーブルが存在する場合は、削除 */
IF OBJECT_ID(N'tempdb..#テーブル名', N'U') IS NOT NULL
DROP TABLE #テーブル名
/* 一時テーブルを作成 */
CREATE TABLE #テーブル名 (
    カラム名 データ型 制約,
    カラム名 データ型 制約
    ・
   ・
    ・
)

サンプル

/* 一時テーブルが存在する場合は、削除 */
IF OBJECT_ID(N'tempdb..#TMP_SEARCH_RESULTS', N'U') IS NOT NULL
DROP TABLE #TMP_SEARCH_RESULTS
;

/* 一時テーブルを作成 */
CREATE TABLE #TMP_SEARCH_RESULTS (
    id int NOT NULL,
    username varchar(20)
);

/* 主キーを設定 */
ALTER TABLE #TMP_SEARCH_RESULTS ADD PRIMARY KEY CLUSTERED(
id asc
);

サンプル

実行結果

テーブルが存在しなかった場合の処理も記述できる。

IF OBJECT_ID(N'tempdb..#TMP_SEARCH_RESULTS', N'U') IS NOT NULL
SELECT '存在する'
ELSE
SELECT '存在しない'
;
実行結果

OBJECT_ID関数について

指定したオブジェクト名とオブジェクトタイプでオブジェクトidが存在するかをチェックする関数です。存在しない場合は、NULLが返ってきます。

OBJECT_ID関数に指定する引数

  • 第一引数:オブジェクト名
  • 第二引数:オブジェクトタイプ

第二引数にN’U’を指定したのは、テーブルを指定したためです。

2016以降のバージョン

SQLServerが2016以降の場合は、「DROP TABLE IF EXISTS」を使用します。こちらはワンライナーで書くことができます。

DROP TABLE IF EXISTS テーブル名

サンプル

DROP TABLE IF EXISTS #TMP_SEARCH_RESULTS

CREATE TABLE #TMP_SEARCH_RESULTS(
    id int,
	username varchar(20)
)
DROP TABLE IF EXISTSの実行結果