QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

SQL Serverでテーブルの主キーやインデックスをSQLで取得したい

こんにちは。

SQL Server 2000 で、SQL文を使ってシステムテーブルにアクセスし、主キーや
インデックスの貼ってある列を取得したいと思っているのですが、うまく取れません。

具体的には、

select *
from sysobjects o join sysindexkeys i on o.id = i.id
where o.xtype = 'U' and o.name = 'テーブル名'

としても、インデックスが1つで1列しかないにもかかわらず、indidが複数行返ってき
ます。
また、sysobjects の xtypeで、PKとすれば主キーオブジェクトは取れるのですが、
その主キーオブジェクトのどの列がキーなのかの情報を取るにはどのシステムテーブ
ルにアクセスすればよいかわかりません。

ご存知の方おられませんでしょうか?

[ メッセージ編集済み 編集者: maru 編集日時 2004-10-27 11:46 ]

質問者:maru

回答

指定したテーブルの主キー列を知りたいってこと?



use Northwind
go

declare @tablename varchar(64)
set @tablename = 'Order Details'

select syscolumns.name
from sysobjects
  inner join syscolumns on sysobjects.id = syscolumns.id
  inner join sysindexkeys on sysobjects.id = sysindexkeys.id and syscolumns.colid = sysindexkeys.colid
  inner join sysindexes on sysindexkeys.id = sysindexes.id and sysindexkeys.indid = sysindexes.indid
where sysobjects.type = 'U'
  and sysobjects.status > 0
  and sysobjects.name = @tablename
  and sysindexes.name in (
    select name
    from sysobjects
    where xtype = 'PK'
      and parent_obj = sysindexes.id
  )

ちなみに、こういった方法はあまり使わないほうが良いいよ。SQL Server 2005 で一部のシステムテーブルが統廃合されていて互換性が失われているし。どのような利用ケースかしらないけど、できることなら ADO や JDBC などのミドルウェア経由で 主キーを求めるのが良いかと。

投稿者:未記入

編集 履歴 (0)

ああ、それと sp_pkeys 使ったほうが楽。

投稿者:未記入

編集 履歴 (0)

システム テーブルは SQL Server のバージョンによって大きく異なる...

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/acdata/ac_8_con_11_3wc1.asp

と注意書きされているので、アプリ開発の場合は
  [システム ストアド プロシージャ] - [カタログ プロシージャ]
   sp_tables
   sp_columns
   sp_pkeys
   sp_fkeys
等を、極力使用しているようにしています。

アプリ開発以外(データ移行、メンテ等)であれば直にシステム テーブルを参照してもよいのでしょうが...
識者を待つしかないです。

[追記]
#被ったけどそのまま残しておきます
[ メッセージ編集済み 編集者: えんぞ@見習 編集日時 2004-10-27 13:46 ]

投稿者:えんぞ@?

編集 履歴 (0)

返答ありがとうございます。

大変参考になりました。ミドルウェアの機能かシステム関数を使うことにします。
Oraclのときは、よくシステムテーブルからテーブル情報を取っていたことがあったので
単純にSQLServerも同様の方法でしようとしてたのでした。

投稿者:maru

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。