356 Stimmen

Wie prüft man, ob ein bestimmter Index in einer Tabelle existiert?

Etwa so:

SELECT
* 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'

sondern für Indizes.

584voto

AdaTheDev Punkte 135097

Sie können dies mit einer einfachen Auswahl wie dieser tun:

SELECT * 
FROM sys.indexes 
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')

140voto

Mr McGoo Punkte 1847

Für SQL 2008 und neuere Versionen Eine prägnantere Methode, um die Existenz eines Indexes zu erkennen, ist die Verwendung der Kodierung INDEXPROPERTY eingebaute Funktion:

INDEXPROPERTY ( object_ID , index_or_statistics_name , property )  

Am einfachsten ist die Verwendung mit dem IndexID Eigentum:

If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexID') Is Null

Wenn der Index existiert, wird die obige Funktion seine ID zurückgeben; wenn nicht, wird sie NULL .

86voto

Hank Freeman Punkte 1082

AdaTheDEV, ich habe Ihre Syntax verwendet und das Folgende erstellt und warum.

Problem: Der Prozess läuft einmal pro Quartal und dauert eine Stunde, da der Index fehlt.

Berichtigung: Ändern Sie den Abfrageprozess oder die Prozedur, um nach einem Index zu suchen und ihn zu erstellen, wenn er fehlt... Derselbe Code wird am Ende der Abfrage und Prozedur platziert, um den Index zu entfernen, da er nicht benötigt wird, aber vierteljährlich. Hier wird nur die Drop-Syntax angezeigt

-- drop the index 
begin

  IF EXISTS (SELECT *  FROM sys.indexes  WHERE name='Index_Name' 
    AND object_id = OBJECT_ID('[SchmaName].[TableName]'))
  begin
    DROP INDEX [Index_Name] ON [SchmaName].[TableName];
  end

end

41voto

Przemyslaw Remin Punkte 5486

Wenn der versteckte Zweck Ihrer Frage darin besteht DROP den Index vor der Erstellung INSERT zu einer großen Tabelle, dann ist dies ein nützlicher Einzeiler:

DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]

Diese Syntax ist seit SQL Server 2016 verfügbar. Dokumentation für IF EXISTS :

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

Falls Sie stattdessen mit einem Primerschlüssel arbeiten, verwenden Sie diesen:

ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]

18voto

Chris Pickford Punkte 8283

Eine geringfügige Abweichung von der ursprünglichen Frage könnte sich jedoch als nützlich erweisen, wenn Sie in Zukunft hier landen und folgende Fragen stellen möchten DROP y CREATE einen Index, d.h. in einem Deployment-Skript.

Sie können die Existenzprüfung umgehen, indem Sie einfach die folgende Anweisung in Ihre create-Anweisung einfügen:

CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);

Lesen Sie hier mehr: CREATE INDEX (Transact-SQL) - DROP_EXISTING-Klausel

N.B. Wie in den Kommentaren erwähnt, muss der Index bereits existieren, damit diese Klausel funktioniert, ohne einen Fehler zu verursachen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X