web-dev-qa-db-fra.com

Comment vérifier si un certain index existe dans une table?

Quelque chose comme ça:

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

mais pour les index.

243
Lieven Cardoen

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')
406
AdaTheDev

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.

72
Mr McGoo

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
66
Hank Freeman

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.

11
Chris Pickford

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.

6
Mark Williams

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:

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

1
Przemyslaw Remin
-- 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
0
Paolo Argentieri