一人アドカレ
| 日 | ポスト |
|---|---|
| 1 | 一時テーブルが存在していたら削除する |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
| 17 | |
| 18 | |
| 19 | |
| 20 | |
| 21 | |
| 22 | |
| 23 | |
| 24 | |
| 25 |
一時テーブルが存在していたら削除する
この記事は自身のブログを書き直したものです。
課題
SQL Server Management Studio上で一時テーブルを使ったクエリをテストしているとき、テスト前に毎回一時テーブルを手動で削除するのが面倒。テスト実行時に一時テーブルが存在していたら削除して作りなおすようにしたい。
準備
実行環境
- SQL Server 2017 Standard
- SQL Server 2008 R2 Express, 2012 Standardでも確認した。
- SQL Server Management Studio 2017
サンプルデータ
fruitsテーブル
| ID | Name | Price |
|---|---|---|
| 1 | apple | 100 |
| 2 | apple | 120 |
| 3 | orange | 50 |
| 4 | orange | 40 |
| 5 | apple | 80 |
| 6 | orange | 60 |
| 7 | banana | 120 |
| 8 | banana | 150 |
解法
OBJECT_ID関数を使って一時テーブルが存在するかどうか調べて、存在するなら削除する。
関数の2つ目の引数'U'は、検索するデータベースオブジェクトとしてユーザー定義のテーブルを指定するってことのよう。
IF OBJECT_ID( N'[tempDB]..[#totalPrice]', N'U' ) IS NOT NULL
BEGIN
DROP TABLE [#totalPrice];
END
SELECT
[Name]
, SUM( [Price] ) AS [Total]
INTO
[#totalPrice]
FROM
[fruits]
GROUP BY
[Name]
ORDER BY
[Name];
SELECT * FROM [#totalPrice];
SELECTクエリの結果は省略。
これでもう次のようなメッセージを見てがっくりすることはない。
メッセージ 2714、レベル 16、状態 6、行 1
データベースに '#totalPrice' という名前のオブジェクトが既に存在します。
感想
クエリを繰り返す時は便利。1,2回流して終わりのクエリだといちいち打つのはだるい。
ただし、Management Studio上でエラーが出ているとき(構文エラーなど)に実行してもエラーが先に出てしまって、肝心のクエリは実行されないので注意。
そういうときはエラーを先に修正したり、 IF OBJECT_ID( N'[hogeTbl]', N'U' ) のブロックだけを実行して一時テーブルの削除だけをしたりと、都合の良いように対応する。
参考
- [https://msdn.microsoft.com/ja-jp/library/ms190328(v=sql.105).aspx:title]