型が違ったり、桁数が違ったりする列ってちらほら出てきますよね。
発見するのが難しかったりするのでSQLを作成しました。
- SELECT DISTINCT
- COL1.TABLE_NAME AS テーブル名
- ,( select b.value from sys.tables a
- left join sys.extended_properties b on a.object_id = b.major_id and a.parent_object_id = b.minor_id
- where a.name =COL1.TABLE_NAME) AS テーブル説明
- , COL1.COLUMN_NAME AS 列名
- , COL1.DATA_TYPE AS 型
- , COL1.CHARACTER_MAXIMUM_LENGTH AS 文字桁
- , COL1.NUMERIC_PRECISION AS 整数桁
- , COL1.NUMERIC_SCALE AS 小数桁
- , COL1.IS_NULLABLE AS NULL許容
- , COMMENT.COLUMN_COMMENT AS 列説明
- FROM INFORMATION_SCHEMA.COLUMNS COL1
- -- コメントを取得
- INNER JOIN(
- select
- t.name as TABLE_NAME
- ,c.name as COLUMN_NAME
- ,ep.value as COLUMN_COMMENT
- from
- sys.tables t
- ,sys.columns c
- ,sys.extended_properties ep
- where
- t.object_id = c.object_id
- and c.object_id = ep.major_id
- and c.column_id = ep.minor_id) COMMENT
- ON COMMENT.TABLE_NAME = COL1.TABLE_NAME
- AND COMMENT.COLUMN_NAME = COL1.COLUMN_NAME
- -- 列の情報が食い違うもの
- LEFT JOIN INFORMATION_SCHEMA.COLUMNS COL2
- ON COL1.COLUMN_NAME = COL2.COLUMN_NAME
- AND (COL1.DATA_TYPE <> COL2.DATA_TYPE
- OR COL1.CHARACTER_MAXIMUM_LENGTH <> COL2.CHARACTER_MAXIMUM_LENGTH
- OR COL1.NUMERIC_PRECISION <> COL2.NUMERIC_PRECISION
- OR COL1.NUMERIC_SCALE <> COL2.NUMERIC_SCALE
- )
- WHERE
- (
- -- 列のコメントが食い違うもの
- (
- select COUNT(distinct ep.value )--c.name AS COLUMN_NAME
- from
- sys.tables t
- ,sys.columns c
- ,sys.extended_properties ep
- where
- t.object_id = c.object_id
- and c.object_id = ep.major_id
- and c.column_id = ep.minor_id
- and c.name = COL1.COLUMN_NAME
- group by c.name
- ) > 1
- -- 列の情報が食い違うもの のJOIN がヒットした
- OR COL2.COLUMN_NAME IS NOT NULL
- )
- -- 列名指定する場合はここに条件
- --WHERE COL1.COLUMN_NAME = 'HIN_CD'
- ORDER BY COL1.COLUMN_NAME ASC
実行すると修正の必要性がある列のみ抽出されます。
Oracleでも似たようなの作っておくと便利!
※ちなみにSQLはインデントなどちゃんと直してません。
0 件のコメント:
コメントを投稿