【SQLServer】テーブルの主キー以外の列名を取得
テーブルの主キー以外の列名を取得する方法。
SQLServer 2008でしか確認していないですけど、
とりあえず情報スキーマビュー、システムテーブル、システムビューから取得する方法。
各バージョンでのマッピングは以下参照
システム テーブルのシステム ビューへのマッピング (Transact-SQL)
情報スキーマビュー
SELECT COLS.COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS AS COLS WHERE COLS.TABLE_NAME = N'テーブル名' AND NOT EXISTS( SELECT 1 FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS KEYS WHERE KEYS.TABLE_NAME = COLS.TABLE_NAME AND KEYS.COLUMN_NAME = COLS.COLUMN_NAME ) ORDER BY COLS.ORDINAL_POSITION
システムテーブル
SELECT COLS.name FROM syscolumns AS COLS INNER JOIN sysobjects AS OBJ ON (OBJ.id=COLS.id) WHERE OBJ.name=N'テーブル名' AND NOT EXISTS( SELECT 1 FROM sysindexes AS IDX INNER JOIN sysindexkeys AS KEYS ON KEYS.indid=IDX.indid WHERE KEYS.id=OBJ.id AND KEYS.colid=COLS.colid ) ORDER BY COLS.colid
システムビュー
SELECT COLS.name FROM sys.columns AS COLS INNER JOIN sys.objects AS OBJ ON (OBJ.object_id=COLS.object_id) WHERE OBJ.name=N'テーブル名' AND NOT EXISTS( SELECT 1 FROM sys.indexes AS IDX INNER JOIN sys.index_columns AS KEYS ON KEYS.index_id=IDX.index_id AND KEYS.object_id=COLS.object_id WHERE KEYS.object_id=OBJ.object_id AND KEYS.column_id=COLS.column_id ) ORDER BY COLS.column_id
逆に主キーの項目取得したい場合は、
「NOT EXISTS」を「EXISTS」にするか、
キー情報が入ってるテーブルをJOINするか
順番とか気にしないのであれば以下のような感じでも
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE TABLE_NAME = N'テーブル名'