Etwa so:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
sondern für Indizes.
Etwa so:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
sondern für Indizes.
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
.
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
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
:
Falls Sie stattdessen mit einem Primerschlüssel arbeiten, verwenden Sie diesen:
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
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 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.