select name, object_id, type, create_date from sys.objects where name = 'TABLE1' name object_id type create_date -------------------- -------------------- ----- ------------------------- TABLE1 1669580986 U 2003-08-27 12:56:34.897 (1 行処理されました)
しかし、sys.objects から一時テーブルの情報を取得するのは困難です。
まず、一時テーブルは tempdb 上に作成されるため、カレントデータベース上の sys.objects ではなく、tempdb.sys.objects を参照しなければなりません。
それに、検索条件にも一工夫必要です。
select name, object_id, type, create_date from tempdb.sys.objects where name like '#temp_table1%' name object_id type create_date -------------- --------------- -------------------- ----- ------------------------- #temp_table1__ ... (中略) ... __000000000005 238623893 U 2007-09-09 20:19:05.467 #target_patl__ ... ... __000000000006 318624178 U 2007-09-09 20:25:06.513 (2 行処理されました)
セッションごとに作成された複数のテーブルがヒットし、自分自身が作成したテーブルがどれかを容易に判定できません。
こんなときには、OBJECT_IDシステム関数が便利です。
select OBJECT_ID('tempdb..#temp_table1') ----------- 318624178 (1 行処理されました)
※一時テーブルの場合、テーブル名を"tempdb.."とデータベース名で修飾する必要があります。
これだと、自分が作成した一時テーブルのみが返ってきます。
この OBJECT_IDシステム関数は、一時テーブルの他にもスキーマスコープオブジェクトであれば利用することができます。
オブジェクトの詳細な情報を取得するには sys.objects などを参照する必要がありますが、オブジェクトが存在するか否かを判断するだけでよいような場合にはこれで十分ですね。
if OBJECT_ID('tempdb..#temp_table1') is not null drop table #temp_table1 create table #temp_table1 ( ID int, NAME varchar(50), VALUE varchar(255) )