2011年2月17日木曜日

【SQLServer】同一列名なのに桁数や列説明が食い違う他テーブルの列を抽出

同じ列名なのに他テーブルでは列説明が違ったり、
型が違ったり、桁数が違ったりする列ってちらほら出てきますよね。

発見するのが難しかったりするので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 件のコメント:

コメントを投稿