How to find which indexes and constraints contain a specific column?

I am planning a database change and I have a list of columns included in the process. Is it possible to list all indexes in which a particular column is included?

Edit

So far (combined with answers):

declare @TableName nvarchar(128), @FieldName nvarchar(128)
select  @TableName= N'<<Table Name>>', @FieldName =N'<<Field Name>>'
(SELECT distinct systab.name AS TABLE_NAME,sysind.name AS INDEX_NAME, 'index' 
FROM sys.indexes sysind 
INNER JOIN sys.index_columns sysind_col 
    ON  sysind.object_id = sysind_col.object_id and sysind.index_id = sysind_col.index_id 
INNER JOIN sys.columns sys_col 
    ON sysind_col.object_id = sys_col.object_id and sysind_col.column_id = sys_col.column_id 
INNER JOIN sys.tables systab
    ON sysind.object_id = systab.object_id

WHERE systab.is_ms_shipped = 0 and sysind.is_primary_key=0 and sys_col.name  =@FieldName and systab.name=@TableName

union
select t.name TABLE_NAME,o.name, 'Default' OBJ_TYPE
 from sys.objects o 
inner join sys.columns c on o.object_id  = c.default_object_id
inner join sys.objects t on c.object_id  = t.object_id 
where o.type  in ('D') and c.name  =@FieldName and t.name=@TableName
union

SELECT u.TABLE_NAME,u.CONSTRAINT_NAME,  'Constraint' OBJ_TYPE  
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE u 

where u.COLUMN_NAME  = @FieldName and u.TABLE_NAME = @TableName
) order by 1

But I'm not too happy with the combination sys.and 'INFORMATION_SCHEMA.' Can it be avoided?

+4
source share
4 answers

SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE

USE TABLE_NAME WHERE, if you need to know the table constraint.

and use column_name if you know the column name.

+3
source
---Using sp_helpindex and your TableName
exec sp_helpindex YourTableName

---Using sys.tables with your TableName and ColumnName
select distinct c.name, i.name, i.type_desc,...
from sys.indexes i
        join sys.index_columns ic on i.index_id = ic.index_id 
        join sys.columns c on ic.column_id = c.column_id
where i.object_id = OBJECT_ID(N'YourTableName') and c.name = 'YourColumnName'

:. - distinct

select c.name, i.name, i.type_desc
from sys.indexes i
        join sys.index_columns ic on i.index_id = ic.index_id and i.object_id = ic.object_id
        join sys.columns c on ic.column_id = c.column_id and ic.object_id = c.object_id
where i.object_id = OBJECT_ID(N'YourTableName') and c.name = 'YourColumnName'
+3

, , :

sys.indexes , sys.index_columns

Query:

SELECT 
     sysind.name AS INDEX_NAME
    ,sysind.index_id AS  INDEX_ID
    ,sys_col.name AS COLUMN_NAME
    ,systab.name AS TABLE_NAME
FROM sys.indexes sysind 
INNER JOIN sys.index_columns sysind_col 
    ON  sysind.object_id = sysind_col.object_id and sysind.index_id = sysind_col.index_id 
INNER JOIN sys.columns sys_col 
    ON sysind_col.object_id = sys_col.object_id and sysind_col.column_id = sys_col.column_id 
INNER JOIN sys.tables systab
    ON sysind.object_id = systab.object_id 
WHERE (1=1) 
      AND systab.is_ms_shipped = 0 
      AND sys_col.name  IN(specific column list for which indexes are to be queried)
ORDER BY 
    systab.name,sys_col.name, sysind.name,sysind.index_id

, !

+2

sys , sys.indexes index_col . index_col (.. 3 , index_col 3 1, 2, 3 )

select index_id from sys.indexes
 where object_id = object_id(@objectname)

select index_col(@objectname, @indexid, 1)

, .

0

All Articles