SQLServerでユニークインデックスとカラム情報を取得してテーブル定義書を作成する
SQLServerで使用されているテーブルの定義書をSQLで簡単に出力できれば便利かと思い、以前に書いた記事のSQLを修正して、ユニークインデックスの情報も出力するように変更してみました。
ユニークインデックスとカラム情報を取得する方法
今回は参照記事のsys.objects, sys.columnsというシステムビューに加えsys.tables,sys.key_constraints,sys.index_columnsも合わせて参照するようにします。
実際にSQLServerでユニークインデックスとカラム情報を取得するSQLは以下の通りです。
-----------------------------------------
--テスト用のターゲットテーブル生成
-----------------------------------------
CREATE TABLE テストテーブル
(
プライマリキー1 varchar(50) NOT NULL
,プライマリキー2 smallint NOT NULL
,カラム1 varchar(50)
,カラム2 smallint NOT NULL
,CONSTRAINT [PK_テストテーブル] PRIMARY KEY CLUSTERED
(
プライマリキー1 ASC
,プライマリキー2 ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
-----------------------------------------
--変数定義
-----------------------------------------
DECLARE @table_name VARCHAR(50) = 'テストテーブル' --ターゲットになるテーブル名
-----------------------------------------
--テーブル仕様書もどき取得
-----------------------------------------
SELECT
t.name AS テーブル名
,c.name AS 項目名
,type_name(c.user_type_id) AS 属性
,c.max_length AS 長さ
,CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS NULL許可
,ISNULL(CAST(pk.key_ordinal AS VARCHAR),'') AS プライマリキー
FROM
sys.objects t
INNER JOIN sys.columns c ON
t.object_id = c.object_id
--以下はプライマリキーの情報を取得
LEFT OUTER JOIN (
SELECT
idx_cols.key_ordinal AS key_ordinal
,cols.name AS col_name
FROM
sys.tables tbls
INNER JOIN sys.key_constraints key_const ON
tbls.object_id = key_const.parent_object_id
AND key_const.type = 'PK'
AND tbls.name=@table_name
INNER JOIN sys.index_columns idx_cols ON
key_const.parent_object_id = idx_cols.object_id
AND key_const.unique_index_id = idx_cols.index_id
INNER JOIN sys.columns cols ON
idx_cols.object_id = cols.object_id
AND idx_cols.column_id = cols.column_id
) AS pk ON
c.name = pk.col_name
--ここまでプライマリキーの情報を取得
WHERE
t.type = 'U'
AND t.name = @table_name
ORDER BY
c.column_id
-----------------------------------------
--テスト用のターゲットテーブル削除
-----------------------------------------
DROP TABLE テストテーブル
上記のSQLを実行すると
テーブル名 項目名 属性 長さ NULL許可 プライマリキー テストテーブル プライマリキー1 varchar 50 NO 1 テストテーブル プライマリキー2 smallint 2 NO 2 テストテーブル カラム1 varchar 50 YES テストテーブル カラム2 smallint 2 NO
のような結果が得られます。
これで「テーブル名」「項目名」「属性」「長さ」「NULLの許可」「プライマリキー」が取得できました。
簡易的なテーブル定義書の下書きがこれで完成です。
以上、SQLServerでユニークインデックスとカラム情報を取得してテーブル定義書を作成するでした。







