- PR -

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

1
投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2004-10-27 11:45
こんにちは。

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 ]
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-10-27 13:32
指定したテーブルの主キー列を知りたいってこと?
コード:
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 などのミドルウェア経由で 主キーを求めるのが良いかと。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-10-27 13:37
ああ、それと sp_pkeys 使ったほうが楽。
えんぞ@?
ぬし
会議室デビュー日: 2004/07/06
投稿数: 271
お住まい・勤務地: はまっこ
投稿日時: 2004-10-27 13:43
引用:

システム テーブルは 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 ]
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2004-10-27 20:08
返答ありがとうございます。

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

1

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