2012-11-13 15 views
18

Mögliche Duplizieren existiert:
List of all index & index columns in SQL Server DBSQL Server 2008 Überprüfen Sie, ob ein Index

Ich würde gerne wissen, ob es eine Möglichkeit, wenn ein Index in einer SQL Server-Datenbank vorhanden ist, um zu überprüfen ist für eine bestimmte Tabelle basierend auf dem Namen der Spalten:

Lassen Sie uns sagen, dass ich das folgende Skript ausführen:

CREATE NONCLUSTERED INDEX [MyIndexName] 
    ON [dbo].[MyTable] ([CustomerId]) 
    INCLUDE ([Id],[ModificationDate],[ProductId]) 
    GO 

Jetzt möchte ich überprüfen, ob der Index basierend auf den Tabellennamen und Spalten (und die Spalten in der Include-Klausel) existiert, nicht den tatsächlichen Indexnamen.

(SQL Server 2008 R2)

Dank

+0

Nicht sicher, wie Sie überprüfen möchten. Vielleicht können Sie [so etwas] (http://sqlfiddle.com/#!3/7b82b/1/0) –

+1

verwenden Es ist tatsächlich Duplikat der verschiedenen Frage-http: //stackoverflow.com/questions/2689766/how- do-you-check-wenn-ein-bestimmter-Index-existiert-in-einer-Tabelle –

+5

@MichaelFreigeimim - Ihre verknüpfte Frage liefert nur dann eine Antwort, wenn Sie den Namen des Index bereits kennen Tabellen- und Spaltenname sind bekannt , aber der Indexname (falls vorhanden) ist unbekannt. – Zarepheth

Antwort

34

Diese Abfrage:

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

Die Informationen sind in den Katalog Metadaten-Ansichten zur Verfügung, etwas entlang der Linien von:

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')); 

Dies erzeugt keine Ja/Nein-Antwort, aber zeigt Ihnen die Indizes, die sein könnten deckt bereits den einen ab, den du planst. Sie müssen sowohl die Schlüsselposition, die Schlüsselrichtung als auch die eingeschlossenen Spalten berücksichtigen, mit deckenden Überlappungen (ein Index auf (K1, K2) deckt (K1) und einen Index mit (C1, C2, C3) Deckungen (C1, C3) Für ein reales Produktivsystem müssten Sie Dinge wie implizit eingeschlossene Spalten (zB die Clustered-Index-Schlüssel), Indexfilterausdrücke und Unterschiede im Indexdatenraum (zB Partitionierung) berücksichtigen.

Verwandte Themen