たにぐちBLOG

C#が好きでたまんない

  PASSJブログ :: ホーム :: 連絡をする :: RSS  :: ATOM :: Login
  31 投稿数 :: 0 ストーリー :: 57 コメント :: 10 トラックバック

過去の記事

カテゴリ

イメージギャラリ

SQL Server 2000の場合
各データベースのsystemテーブルの
syscolumnsテーブル
colstat列(smallint型)

(colstat & 1) != 0   :IDENTITY
(colstat & 2)  != 0  :ROWGUID
(colstat & 4)  != 0  :計算列

ちなみに、計算列については
iscomputed(int)という列が別にあり、値が1の時、計算列になっている模様
isnullable(int)ではNOT NULLかどうかを判別できます。

SQL Server 2005の場合
システムテーブルがビューに移動しています。
dbo.syscolumnsシステムテーブルは、sys.syscolumnsビューになっています。
システムテーブルが無くなりビューになったため、ここには従来のようなシステムテーブルの列情報は含まれていません。このため従来のdbo.syscolumnsに相当するのは、sys.all_columnsとなるようです。
sys.all_columnsにはis_identityという列があり、IDENTITY列かどうかはこれで判別できるようです(おーっ、わかりやすいっ!)。ROWGUIDも、is_rowguidcol列で取得できます。計算列は別なビューsys.computed_columnsに収まっているようです。
ちなみに、dbo.sysobjectsシステムテーブルもsys.sysobjectsビューになっており、同じくここにはユーザー定義のオブジェクトのみが含まれています(なお従来のようにdbo.sysobjectsでも参照可能)。従来のdbo.sysobjectsに相当するのは、sys.all_objectsのようです。

SQL Server 2005への移行の際、これらの情報を直接取得するプログラムがある場合、書き換える必要がありそうです。

投稿日時 : 2004年5月2日 14:54

コメントを追加

# re: IDENTITY,ROWGUID,計算列の判別法 2004/05/03 1:48 松本崇博
たにぐちさん、こんにちは。
IDENTITY を colstat で調べられるの便利ですね!
この Blog も参考になると思います。

How to find all the identity fields in a database
http://dotnetjunkies.com/WebLog/jhaley/archive/2004/04/12/11241.aspx

Jason Haley さんの c.status = 128 -- 0x80 で調べる方法は
Books Online に記述があるのでこちらも捨てがたいですね。

あと、sp_MShelpcolumns ストアドプロシージャの中では、
COLUMNPROPERTY を使って調べてるみたいです。

SELECT COLUMNPROPERTY(OBJECT_ID('Products'),'ProductID','IsIdentity')

第3引数に IsComputed で計算列、IsRowGuidCol で ROWGUID も OK みたいです
http://www.microsoft.com/japan/msdn/library/ja/tsqlref/ts_ca-co_0mpl.asp

# re: IDENTITY,ROWGUID,計算列の判別法 2004/05/03 10:53 たにぐち
おーっ、ありがとうございます!sp_MShelpcolumns は知りませんでした。c.status=128も知りませんでした。いじくりまわして色々調べたつもりだったんですが。。今後もよろしくお願いいたします。(それから今年の松本さんのPassJの講演は前のほうで聞いていました。SQL Serverでこのレベルのパフォチューなんて考えたことも無かったので、驚いてしまいました。。)


コメント

タイトル:
名前:
Url:
コメント: