@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

SQLサーバー、ストアドプロシージャ内でのテーブル存在チェック

1
投稿者投稿内容
saya24
会議室デビュー日: 2007/11/14
投稿数: 3
投稿日時: 2007-11-14 23:46
ある処理の中で一時的に必要になるテーブル「A」があったとします。基本的には処理の最終段階で当該がDropされる仕組みですが、実行が失敗に終わるとこのテーブルが残ってしまう状況にあります。
次回同処理(ストアドプロシージャ)実行時、テーブル「A」が存在した場合はDropすることから行いたk、その為のテーブル既存チェックが必要です。

ストアードプロシージャ内で
IF (SELECT COUNT(*) FROM sysobjects Where Name= 'A' AND xType= 'U') = 1
という記述をすると、'A'というテーブルが存在しません、という構文エラーとなってしまいます。
この当たり前の牽制に悩んでいるのですが、どうにかストアードプロシージャ内で、自DB内のテーブル存在チェックを果たすことはできないのでしょうか??

どなたかご教示頂けますと幸いです。
OakBow
ベテラン
会議室デビュー日: 2007/09/15
投稿数: 51
投稿日時: 2007-11-14 23:54
えーと、MSSQLってことでいいんでしょうか。RDBMSは。

IF EXISTS(SELECT * FROM sysobject・・・
ってすればいいんじゃないでしょうか。
DBのスクリプトを生成する際、テーブルをDropするオプションを有効にして
やると、このようなSQL文を作ってくれたりしますけどね。

そもそも一時的に必要なテーブルなら一時テーブルにすればいいような
気がしますけれども。
dodo
ベテラン
会議室デビュー日: 2004/05/12
投稿数: 99
お住まい・勤務地: 東京都渋谷区
投稿日時: 2007-11-15 00:05
引用:

saya24さんの書き込み (2007-11-14 23:46) より:
ストアードプロシージャ内で
IF (SELECT COUNT(*) FROM sysobjects Where Name= 'A' AND xType= 'U') = 1
という記述をすると、'A'というテーブルが存在しません、という構文エラーとなってしまいます。



まず、RDBMSの種類とバージョンを書くようにしてください。
恐らくSQLServer 2005かな?

検証していませんが、以下の書き方でどうですか?
--
if exists (select 1 from sysobjects where id = object_id('A') xtype= 'U')
drop table A
--
[追記]
この質問はDatabase Expertの方が、投稿先として適切だったと思います。
http://www.atmarkit.co.jp/bbs/phpBB/viewforum.php?forum=26&8532

[ メッセージ編集済み 編集者: dodo 編集日時 2007-11-15 00:12 ]
saya24
会議室デビュー日: 2007/11/14
投稿数: 3
投稿日時: 2007-11-15 00:47
皆様ご支援ありがとうございます。

現在いる場所、というか自宅にはSQLの環境がありませんので
明日ご提示のSELECT文に変えて検証させて頂きます。

>そもそも一時的に必要なテーブルなら一時テーブルにすればいいような
>気がしますけれども。

一時テーブルという概念があるのですか?
まさに処理内でのみ必要なテーブルなのですが、どのように定義するのでしょう?


追記:
掲示板が分野に分かれており、入口選択の上書き込むことをしっかり把握できておりませんでした。失礼致しました。
OakBow
ベテラン
会議室デビュー日: 2007/09/15
投稿数: 51
投稿日時: 2007-11-15 01:54
>一時テーブルという概念があるのですか?
>まさに処理内でのみ必要なテーブルなのですが、どのように定義するのでしょう?

ここに質問したり開発したりする前に、まずBOL読むべきじゃないでしょうか。
環境がないにしても検索することくらいはできるはずですが、調べて分かることを
すぐに聞いていては何も身につきませんよ。
正直sysobjects知ってて一時テーブルを知らないというのは驚きですし、まずは
手に入る情報で学習していく必要があると思います。

MSSQL使っているならBooks On Lineが入ってるはずです。
学習の教材としても使えますし、開発を行う際にもとてもお世話になります。
まずこれを使い、「人に聞かないとなかなか得られないノウハウ」などを掲示板
で質問するなど、使い分けていく必要があると思います。
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-11-15 09:18
Microsoft SQL Server Management Studio が入っているなら(無料です)
インスタンスを選択→データベースを選択→テーブルを選択したのち
ツリー上の該当テーブル名で右クリックし、「名前をつけてテーブルをスクリプト化」から"DROP"を選択していけば、存在チェックを含んだクエリを自動生成してくれます。

コード:

IF  EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[削除したいテーブル名]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[削除したいテーブル名]


1

スキルアップ/キャリアアップ(JOB@IT)