SQL Serverのカラムに設定されている論理名をまとめて取得する

あらすじ

とあるスキーマの全てのテーブルのカラムに設定されている論理名をSQLでぶっこ抜きたい。

環境

SELECT SERVERPROPERTY('productversion') as VERSION;
VERSION
14.0.1000.169

やり方

カラムの論理名はsys.extended_propertiesvalueに格納されている。 また、スキーマはsys.schemas、テーブルはsys.tables、カラムはsys.columnsにそれぞれ格納されている。

表示したいスキーマとテーブル名あたりで絞って使いたい。

--A5:SQL Mk-2用の疑似命令
--*SetParameter P0 'SAMPLE_SCHEMA' String
--*SetParameter P1 'SAMPLE_TABLE' String
SELECT
  CONCAT(T1.schema_name, '.', T1.table_name, '.', T1.column_name) AS schema_table_column
  , CONCAT('[', CAST(T2.table_comment AS nvarchar(MAX)), '].[', CAST(T1.column_comment AS nvarchar(MAX)), ']') AS table_comment_column_comment
  , T1.schema_name
  , T1.table_name
  , T1.column_name
  , T2.table_comment
  , T1.column_comment 
FROM
  ( 
    SELECT
      s.name        AS schema_name
      , s.schema_id AS schema_id
      , t.name      AS table_name
      , t.schema_id AS tschema_id
      , c.name      AS column_name
      , e.major_id  AS major_id
      , e.minor_id  AS minor_id
      , e.value     AS column_comment 
    FROM
      sys.schemas s
      , sys.tables t
      , sys.columns c
      , sys.extended_properties e 
    WHERE
      s.schema_id     = t.schema_id 
      AND t.object_id = c.object_id 
      AND c.object_id = e.major_id 
      AND c.column_id = e.minor_id 
      AND s.name      = @P0 
      AND t.name      = @P1
  ) AS T1
  , ( 
    SELECT
      s.name        AS schema_name
      , s.schema_id AS schema_id
      , t.name      AS table_name
      , t.schema_id AS tschema_id
      , e.major_id  AS major_id
      , e.minor_id  AS minor_id
      , e.value     AS table_comment 
    FROM
      sys.schemas s
      , sys.tables t
      , sys.extended_properties e 
    WHERE
      s.schema_id     = t.schema_id 
      AND t.object_id = e.major_id 
      AND e.minor_id  = 0 
-- スキーマとテーブル名で絞る場合はここのコメントアウトを外す
--      AND s.name      = @P0 
--      AND t.name      = @P1
  ) AS T2 
WHERE
  T1.major_id = T2.major_id 
ORDER BY
  T1.major_id, T1.minor_id;

実行結果

こんな感じで取得できる。Schema_Table_ColumnTableComment_ColumnCommentは個人的に取得しておきたい文字の並び。

Schema_Table_Column TableComment_ColumnComment sname tname cname TableComment ColumnComment
SAMPLE_SCHEMA.SAMPLE_TABLE.LOGIN_ID [ユーザーテーブル].[ログインID] SAMPLE_SCHEMA SAMPLE_TABLE LOGIN_ID ユーザーテーブル ログインID
SAMPLE_SCHEMA.SAMPLE_TABLE.USER_NAME [ユーザーテーブル].[ユーザー名] SAMPLE_SCHEMA SAMPLE_TABLE USER_NAME ユーザーテーブル ユーザー名
SAMPLE_SCHEMA.SAMPLE_TABLE.ADDRESS [ユーザーテーブル].[住所] SAMPLE_SCHEMA SAMPLE_TABLE ADDRESS ユーザーテーブル 住所
SAMPLE_SCHEMA.SAMPLE_TABLE2.CATEGORY_ID [カテゴリーテーブル].[カテゴリID] SAMPLE_SCHEMA SAMPLE_TABLE2 CATEGORY_ID カテゴリーテーブル カテゴリID
SAMPLE_SCHEMA.SAMPLE_TABLE2.CATEGORY_NAME [カテゴリーテーブル].[カテゴリ名] SAMPLE_SCHEMA SAMPLE_TABLE2 CATEGORY_NAME カテゴリーテーブル カテゴリ名

参考