4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

一時テーブルが存在していたら削除する

Last updated at Posted at 2019-12-01

一人アドカレ

ポスト
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]
4
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?