遠離INFORMATION_SCHEMA.COLUMNS
,特別是對於索引,因爲像過濾索引和包含列之類的東西不是定義的一部分。我講這個在這裏更詳細:
The case against INFORMATION_SCHEMA views
你想用這個sys.indexes
和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;
您沒有指定要使用的SQL Server的版本,所以這裏有所有關於sys.indexes
和sys.index_columns
的鏈接主題:
SYS.INDEXES
SQL硒rver 2005 http://technet.microsoft.com/en-us/library/ms173760%28SQL.90%29.aspx
SQL Server 2008中http://technet.microsoft.com/en-us/library/ms173760%28SQL.100%29.aspx
SQL Server 2008 R2的http://technet.microsoft.com/en-us/library/ms173760%28SQL.105%29.aspx
SQL Server 2012中http://technet.microsoft.com/en-us/library/ms173760%28SQL.110%29.aspx
sys.index_columns
的SQL Server 2005 http://technet.microsoft.com/en-us/library/ms175105%28SQL.90%29.aspx
SQL Server 2008中http://technet.microsoft.com/en-us/library/ms175105%28SQL.100%29.aspx
SQL Server 2008中R2 http://technet.microsoft.com/en-us/library/ms175105%28SQL.105%29.aspx
S QL Server 2012 http://technet.microsoft.com/en-us/library/ms175105%28SQL.110%29.aspx
您也可以查看Kimberley L. Tripp的sp_helpindex2。
編輯
總的來說,我同意@ BrianWhite的評論。如果你在這方面付出了一切努力,那麼你應該使用一個工具來代替重新發明輪子並嘗試自己寫。從時間和成本上來看,您可能已經花費了一次這樣的查詢。請閱讀這篇文章:
http://bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/
RedGate SQL比較工作在MySQL?這是我們用來比較表格模式的工具。 –
+1 @ @ BrianWhite的評論。 http://bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/ –