399 votes

Liste de tous les index et colonnes d'index dans la BD SQL Server

Comment obtenir une liste de tous les index et colonnes d'index dans SQL Server 2005+ ? Le plus proche que j'ai pu obtenir est :

select s.name, t.name, i.name, c.name from sys.tables t
inner join sys.schemas s on t.schema_id = s.schema_id
inner join sys.indexes i on i.object_id = t.object_id
inner join sys.index_columns ic on ic.object_id = t.object_id
inner join sys.columns c on c.object_id = t.object_id and
        ic.column_id = c.column_id

where i.index_id > 0    
 and i.type in (1, 2) -- clustered & nonclustered only
 and i.is_primary_key = 0 -- do not include PK indexes
 and i.is_unique_constraint = 0 -- do not include UQ
 and i.is_disabled = 0
 and i.is_hypothetical = 0
 and ic.key_ordinal > 0

order by ic.key_ordinal

Ce qui n'est pas exactement ce que je veux.
Ce que je veux, c'est lister tous les index définis par l'utilisateur, ( ce qui signifie qu'il n'y a pas d'index qui supportent les contraintes uniques et les clés primaires. ) avec toutes les colonnes (classées par ordre d'apparition dans la définition de l'index) et autant de métadonnées que possible.

1 votes

La solution ci-dessus est élégante, mais selon MS, INDEXKEY_PROPERTY est en train d'être déprécié. Voir : msdn.microsoft.com/fr/us/library/ms186773.aspx

0 votes

Notez juste que si vous allez utiliser l'une des requêtes de travail dans les réponses ici pour script vos index, vous devez incorporer la colonne filter_definition de la table sys.indexes dans vos requêtes pour obtenir la définition de filtre des index non-clustered dans SQL 2008+ AM.

0 votes

Notez que comme le souligne l'utilisateur3101273 ci-dessous, aucune des réponses n'inclut le filtre d'index (colonne filter_definition de la table sys.indexes).

-2voto

Vinod G Points 11
sELECT 
     TableName = t.name,
     IndexName = ind.name,
     --IndexId = ind.index_id,
     ColumnId = ic.index_column_id,
     ColumnName = col.name,
     key_ordinal,
     ind.type_desc
     --ind.*,
     --ic.*,
     --col.* 
FROM 
     sys.indexes ind 
INNER JOIN 
     sys.index_columns ic ON  ind.object_id = ic.object_id and ind.index_id = ic.index_id 
INNER JOIN 
     sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id 
INNER JOIN 
     sys.tables t ON ind.object_id = t.object_id 
WHERE 
     ind.is_primary_key = 0 
     AND ind.is_unique = 0 
     AND ind.is_unique_constraint = 0 
     AND t.is_ms_shipped = 0 
     and t.name='CompanyReconciliation' --table name
     and key_ordinal>0
ORDER BY 
     t.name, ind.name, ind.index_id, ic.index_column_id

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X