INFORMATION_SCHEMA.COLUMNS
フィルタリングされたインデックスや含まれる列などは定義の一部ではないため、特にインデックスの場合は避けてください。これについては、ここで詳しく説明します。
sys.indexes
これにはandを使用sys.index_columns
します。例えば:
DECLARE @tablename NVARCHAR(512) = 'dbo.tbl_ClientDN';
SELECT
[Index] = i.name,
[Column] = c.Name,
[Type] = i.type_desc,
PK = i.is_primary_key,
[Unique] = i.is_unique,
[Unique Constraint] = i.is_unique_constraint,
[DESC] = ic.is_descending_key,
[INCLUDE] = ic.is_included_column,
[Filtered] = i.filter_definition -- only for SQL Server 2008+
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.columns c
ON ic.column_id = c.column_id
AND ic.[object_id] = c.[object_id]
WHERE
i.[object_id] = OBJECT_ID(@tablename)
ORDER BY [Index], ic.index_column_id;
一度にすべてのテーブルに対してこれを行う場合は、簡単な変更を行います。
SELECT
[Table] = QUOTENAME(OBJECT_SCHEMA_NAME(i.[object_id]))
+ '.' + QUOTENAME(OBJECT_NAME(i.[object_id])),
[Index] = i.name,
[Column] = c.Name,
[Type] = i.type_desc,
PK = i.is_primary_key,
[Unique] = i.is_unique,
[Unique Constraint] = i.is_unique_constraint,
[DESC] = ic.is_descending_key,
[INCLUDE] = ic.is_included_column,
[Filtered] = i.filter_definition -- only for SQL Server 2008+
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.columns c
ON ic.column_id = c.column_id
AND ic.[object_id] = c.[object_id]
ORDER BY [Table], [Index], ic.index_column_id;
詳細については、トピックsys.indexesおよびsys.index_columnsを参照してください。
Kimberley L. Tripp のsp_helpindex2も参照してください。
編集
一般的に、@BrianWhite のコメントに同意します。これに何らかの労力を費やしている場合は、車輪を再発明して自分で記述しようとするのではなく、ツールを使用する必要があります。おそらく、この 1 つのクエリのトラブルシューティングに、時間に関しては、優れたツールのコストが既に費やされています。この投稿を読んでください: