web-dev-qa-db-fra.com

SQL Server 2008 Vérifier si un index existe

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

18
Baral

Essayez cette requête:

if exists(
           SELECT 1 
           FROM sys.indexes 
           WHERE name = 'INDEX' 
           AND object_id = OBJECT_ID('TABLENAME')
          )
 begin
 ....
 end
34
Parado

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)

0
Remus Rusanu