Duplicata possible:
Liste de toutes les colonnes d'index et d'index dans la base de données SQL Server
Je voudrais savoir s'il existe un moyen de vérifier si un index existe dans une base de données SQL Server pour une table spécifique en fonction du nom des colonnes:
Supposons que j'exécute le script suivant:
CREATE NONCLUSTERED INDEX [MyIndexName]
ON [dbo].[MyTable] ([CustomerId])
INCLUDE ([Id],[ModificationDate],[ProductId])
GO
Maintenant, je voudrais vérifier si l'index existe en fonction du nom de la table et des colonnes (et des colonnes de la clause include), pas du nom d'index réel.
(SQL Server 2008 R2)
Merci
Essayez cette requête:
if exists(
SELECT 1
FROM sys.indexes
WHERE name = 'INDEX'
AND object_id = OBJECT_ID('TABLENAME')
)
begin
....
end
Les informations sont disponibles dans les vues de métadonnées du catalogue, quelque chose comme:
select ...
from sys.indexes i
join sys.index_columns ic on i.object_id = ic.object_id
and i.index_id = ic.index_id
join sys.columns c
on ic.object_id = c.object_id
and ic.index_column_id = c.column_id
where i.object_id = object_id('MyTable')
and (c.name = 'CustomerId' and ic.key_ordinal = 1 and ic.is_descending_key = 0)
or (ic.is_included_column = 1 and c.name in ('Id', 'ModificationDate', 'ProductId'));
Cela ne produit pas de réponse oui/non mais vous montre les index qui pourraient déjà couvrir celui que vous envisagez. Vous devez tenir compte à la fois de la position clé, de la direction des clés et des colonnes incluses, avec des chevauchements de recouvrement (un index sur les couvertures (K1, K2) (K1) et un index qui comprend (C1, C2, C3) les couvertures (C1, C3) Pour un vrai système de production, vous devez prendre en compte des éléments tels que les colonnes implicitement incluses (par exemple, les clés d'index cluster), les expressions de filtre d'index et les différences dans l'espace de données d'index (par exemple, partitioninig)