データベース内のすべてのテーブルで、PK (複合または非複合) の一部であるすべての列を特定したいと考えています。SQLステートメントでそれを行うにはどうすればよいですか? 望ましい結果セット:
テーブル名 | 列名 | データ型 | 制約 |
データベース内のすべてのテーブルで、PK (複合または非複合) の一部であるすべての列を特定したいと考えています。SQLステートメントでそれを行うにはどうすればよいですか? 望ましい結果セット:
テーブル名 | 列名 | データ型 | 制約 |
これはずっと前に自分のスニペット フォルダにコピーしたものなので、信用はできませんが、これはうまく機能します...
select s.name as TABLE_SCHEMA, t.name as TABLE_NAME, k.name as CONSTRAINT_NAME, c.name as COLUMN_NAME, ic.key_ordinal AS ORDINAL_POSITION
from sys.key_constraints as k
join sys.tables as t
on t.object_id = k.parent_object_id
join sys.schemas as s
on s.schema_id = t.schema_id
join sys.index_columns as ic
on ic.object_id = t.object_id
and ic.index_id = k.unique_index_id
join sys.columns as c
on c.object_id = t.object_id
and c.column_id = ic.column_id
where k.type = 'PK';
SELECT o.name AS TableName, c.Name AS ColumnName, t.name AS DataType, kc.name AS ContraintName
FROM sys.key_constraints kc
INNER JOIN sys.index_columns ic ON kc.parent_object_id = ic.object_id AND kc.unique_index_id = ic.index_id
INNER JOIN sys.columns c ON ic.column_id = c.column_id AND c.object_id = ic.object_id
INNER JOIN sys.objects o ON ic.object_id = o.object_id
INNER JOIN sys.types t ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id
WHERE kc.type = 'PK'
ORDER BY TableName,ic.key_ordinal