一人アドカレ
日 | ポスト |
---|---|
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]