思考停止するな

ネットワークとかアプリケーションとかWebとか

SQLServerでテーブル名と主キーの一覧を取得する

スポンサーリンク

SQLServerでテーブル名と主キー(PRIMARY KEY )の一覧を取得する方法についてです。
ただ単に取得するだけでなく、テーブル毎に主キーをまとめて,区切りにしています。
(複数行の列をグループ化)
1行にまとめるのはOracleであれば、LISTAGG関数を使うことでできるみたいですね。
今回はSQLServerなので、別の方法を使っています。

ちょっと冗長な書き方になってしまっているので、もう少し綺麗にしたいところではあります。

SELECT
 A.table_name
 ,(
    SELECT
      sub.caramu_name + ','
    FROM (
select
    t.name as table_name,
    c.name as caramu_name
from sys.indexes as i
    inner join sys.index_columns as ic
        on i.object_id = ic.object_id and i.index_id = ic.index_id
    inner join sys.tables as t
        on t.object_id = i.object_id
    inner join sys.columns as c
        on ic.object_id = c.object_id and ic.column_id = c.column_id
where i.is_primary_key = 1
)  AS sub
    WHERE sub.table_name = A.table_name
    FOR XML PATH('')
  ) AS name_concat
FROM (
select
    t.name as table_name,
    c.name as caramu_name
from sys.indexes as i
    inner join sys.index_columns as ic
        on i.object_id = ic.object_id and i.index_id = ic.index_id
    inner join sys.tables as t
        on t.object_id = i.object_id
    inner join sys.columns as c
        on ic.object_id = c.object_id and ic.column_id = c.column_id
where i.is_primary_key = 1
) AS A
GROUP BY table_name

上記のクエリ作成にあたり下記サイトを参考にさせていただきました。
ichiroku11.hatenablog.jp

http://blog.livedoor.jp/oolv/archives/370268.html

SQL Server で複数行の列をグループ化してCSV出力。ついでにJSON。 | たんたか