Etwas wie das:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
aber für Indizes.
Etwas wie das:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
aber für Indizes.
Antworten:
Sie können dies mit einer einfachen Auswahl wie folgt tun:
SELECT *
FROM sys.indexes
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')
IF EXISTS(SELECT * ...) BEGIN ... END
.
YourTableName
der vollständige Name mit Schema sein sollte
Für SQL 2008 und höher ist die Verwendung der INDEXPROPERTY
integrierten Funktion eine präzisere Methode zum Erkennen der Indexexistenz in Bezug auf die Codierung :
INDEXPROPERTY ( object_ID , index_or_statistics_name , property )
Die einfachste Verwendung ist mit der IndexID
Eigenschaft:
If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexID') Is Null
Wenn der Index vorhanden ist, gibt der oben genannte seine ID zurück. Wenn dies nicht der Fall ist, wird es zurückkehren NULL
.
AdaTheDEV, ich habe Ihre Syntax verwendet und Folgendes erstellt und warum.
Problem: Der Prozess wird vierteljährlich ausgeführt und dauert aufgrund des fehlenden Index eine Stunde.
Korrektur: Ändern Sie den Abfrageprozess oder die Prozedur, um nach dem Index zu suchen und ihn zu erstellen, falls er fehlt. Der gleiche Code wird am Ende der Abfrage und der Prozedur zum Entfernen des Index platziert, da er nicht benötigt wird, sondern 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
Eine leichte Abweichung von der ursprünglichen Frage kann sich jedoch als nützlich für zukünftige Menschen erweisen, die hier landen und wollen DROP
undCREATE
einen Index, dh in einem Bereitstellungsskript.
Sie können die vorhandene Prüfung umgehen, indem Sie Ihrer create-Anweisung Folgendes hinzufügen:
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
Lesen Sie hier mehr: CREATE INDEX (Transact-SQL) - DROP_EXISTING-Klausel
Hinweis Wie in den Kommentaren erwähnt, muss der Index bereits vorhanden sein, damit diese Klausel ohne Fehler funktioniert.
Wenn der versteckte Zweck Ihrer Frage darin besteht, DROP
den Index vor dem Erstellen INSERT
einer großen Tabelle zu erstellen, 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
:
Wenn Sie stattdessen einen Primery-Schlüssel verwenden, verwenden Sie diesen:
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
Schrieb die folgende Funktion, mit der ich schnell überprüfen kann, ob ein Index vorhanden ist. funktioniert genauso wie OBJECT_ID.
CREATE FUNCTION INDEX_OBJECT_ID (
@tableName VARCHAR(128),
@indexName VARCHAR(128)
)
RETURNS INT
AS
BEGIN
DECLARE @objectId INT
SELECT @objectId = i.object_id
FROM sys.indexes i
WHERE i.object_id = OBJECT_ID(@tableName)
AND i.name = @indexName
RETURN @objectId
END
GO
BEARBEITEN: Dies gibt nur die OBJECT_ID der Tabelle zurück, ist jedoch NULL, wenn der Index nicht vorhanden ist. Ich nehme an, Sie könnten dies so einstellen, dass index_id zurückgegeben wird, aber das ist nicht besonders nützlich.
-- Delete index if exists
IF EXISTS(SELECT TOP 1 1 FROM sys.indexes indexes INNER JOIN sys.objects
objects ON indexes.object_id = objects.object_id WHERE indexes.name
='Your_Index_Name' AND objects.name = 'Your_Table_Name')
BEGIN
PRINT 'DROP INDEX [Your_Index_Name] ON [dbo].[Your_Table_Name]'
DROP INDEX [our_Index_Name] ON [dbo].[Your_Table_Name]
END
GO
So überprüfen Sie, ob der Clustered Index für eine bestimmte Tabelle vorhanden ist oder nicht:
SELECT * FROM SYS.indexes
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')