This post is to help people who had tough time to get information about index and its included columns in SQL Server. Whenever I need, I always depend on object explorer and get the definition of the index.So I thought of compiling a snippet as below that can provide these information handy.
I created a procedure called – sp_helpindexExtended as below and the Tablename as parameter(this is an optional parameter).
Procedure Definition
Create Proc sp_helpindexExtended (@TableName sysname = NULL)
as
Begin
;With cte as
(
Select Object_name(A.object_id) objectname,A.name index_name,
Lower(type_desc) + Case When IS_Unique =1 then ', unique' Else '' end +
Case when is_primary_key =1 Then ', primary key' Else '' End+
Case when IS_Unique_Constraint = 1 Then ',unique key' Else '' End index_description,
Case when is_included_column=0 then c.name + '('+
Case When System_type_id = User_Type_id Then Type_Name(System_type_id) Else Type_Name(User_Type_id) End +')' Else NULL end ColumnName,
Case when is_included_column=1 then c.name + '('+
Case When System_type_id = User_Type_id Then Type_Name(System_type_id) Else Type_Name(User_Type_id) End +')' Else NULL end IncludedColumnnames
,Is_Unique,Is_Primary_Key,IS_Unique_Constraint,Fill_factor,key_ordinal
From sys.indexes A
Inner Join sys.index_columns B On A.object_id = B.object_id And A.index_id = B.index_id
Inner Join sys.columns C On c.object_id = B.object_id And C.column_id = B.column_id
Where A.Object_ID = Case when @TableName is not null Then OBJECT_ID(@TableName) Else A.object_id End
) SELECT objectname,index_name,index_description,
stuff(( SELECT ','+ColumnName AS [text()] FROM cte p2
WHERE p2.objectname = p1.objectname and p2.index_name = p1.index_name
ORDER BY key_ordinal asc FOR XML PATH('') ), 1, 1,'') AS index_keys,
stuff( ( SELECT IsNull(','+IncludedColumnnames ,'') FROM cte p2
WHERE p2.objectname = p1.objectname and p2.index_name = p1.index_name
ORDER BY key_ordinal asc FOR XML PATH('') ), 1, 1,'') AS included_keys
,fill_factor
FROM cte p1 GROUP BY objectname,index_name ,index_description,fill_factor
order by objectname asc
End
Procedure Usage
-- To get for all tables
exec sp_helpindexextended
-- To get only for a table
exec sp_helpindexextended 'tablename'