[SQL Server] OBJECT_IDシステム関数 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

SQL Server でテーブルやインデックスなどのオブジェクトの情報を取得する時、sys.objects などのビューをよく使います。

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)
)