SQLServerに一時テーブルが存在したらDropしてからCreateする方法
IF EXISTS テーブル名やIF OBJECT_ID(N’#テーブル名, N’U’) IS NOT NULLを使用してDROP及びCREATEする。
SQL Server 2014、2016、2019、2020
同一セッションですでに一時テーブルを作成している場合、再度テーブル作成クエリを流すとエラーになるので、一時テーブルが存在しているかチェックして、存在する場合はテーブルを削除(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)
)
