Quelque chose comme ça:
SELECT
*
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'
mais pour les index.
Vous pouvez le faire en utilisant une simple sélection comme ceci:
SELECT *
FROM sys.indexes
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')
Une méthode plus concise, du point de vue du codage, pour détecter l’existence d’index est la suivante:
If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexId') Is Null
Si l'index existe, IndexProperty renverra un ID, sinon il ne le fera pas.
AdaTheDEV, j'ai utilisé votre syntaxe et créé ce qui suit et pourquoi.
Problème: le processus s'exécute une fois par trimestre en prenant une heure en raison de l'index manquant.
Correction: modifiez le processus de requête ou la procédure pour rechercher un index et créez-le en cas d'absence ... Le même code est placé à la fin de la requête et la procédure pour supprimer l'index, car il n'est pas nécessaire mais trimestriel. Afficher uniquement la syntaxe de dépôt ici
-- 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
Cependant, un léger écart par rapport à la question initiale pourrait s’avérer utile pour les futurs arrivants qui souhaitent créer un index DROP
et CREATE
, c’est-à-dire dans un script de déploiement.
Vous pouvez contourner le contrôle exist en ajoutant simplement les éléments suivants à votre instruction create:
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
Lisez plus ici: CREATE INDEX (Transact-SQL) - Clause DROP_EXISTING
N.B. Comme mentionné dans les commentaires, l'index doit déjà exister pour que cette clause fonctionne sans générer d'erreur.
A écrit la fonction ci-dessous qui me permet de vérifier rapidement si un index existe; fonctionne comme 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
EDIT: Cela retourne simplement l'ID OBJECT_ID de la table, mais ce sera NULL si l'index n'existe pas Je suppose que vous pouvez définir ceci pour retourner index_id, mais ce n'est pas très utile.
Si le but caché de votre question est de modifier DROP
l'index avant de transformer INSERT
en table volumineuse, il est utile d'utiliser une seule ligne:
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
Cette syntaxe est disponible depuis SQL Server 2016. Documentation pour IF EXISTS
:
-- 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