型が違ったり、桁数が違ったりする列ってちらほら出てきますよね。
発見するのが難しかったりするので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 件のコメント:
コメントを投稿