Sql server 2005 - detruire tous les indexes appliques sur un meme champ dans toutes les tables

Contenu du snippet

Des outils de génération automatique peuvent créer toutes les tables d'une base selon un même schéma (on retrouve certains champs dans toutes les tables).
On peut vouloir créer un index sur ces champs, ce qui peut être une erreur.
Voila donc un script qui effectue l'inverse du script de création :
- http://www.sqlfr.com/codes/SQL-SERVER-2005-CREER-INDEXES-SUR-CHAMP-EXISTANT_39938.aspx

Source / Exemple :


-- =============================================
-- Author:		ROMELARD FABRICE
-- Create date: 18-10-2006
-- Description: Script de destruction des Indexes avec un champ choisi
-- =============================================
---------------------------------------------------------------------------------------------------------------------------------------
USE [MaBase]

---------------------------------------------------------------------------------------------------------------------------------------
-- Spécification du champ qui doit être indexé
---------------------------------------------------------------------------------------------------------------------------------------
DECLARE @NOM_CHAMP		AS VARCHAR(50)
SET @NOM_CHAMP = 'MonChamp'

---------------------------------------------------------------------------------------------------------------------------------------
DECLARE @SQL						AS VARCHAR(MAX)

---------------------------------------------------------------------------------------------------------------------------------------
-- Déclaration du Curseur de sélection
---------------------------------------------------------------------------------------------------------------------------------------
DECLARE TESTCURSEUR CURSOR 
   FOR SELECT 'DROP INDEX ['+ IDX.name +'] ON ['+ SCH.name +'].['+ OBJ.name +'] WITH (ONLINE = OFF)' AS SQLCMD
		FROM  sys.index_columns IDXC INNER JOIN sys.objects OBJ ON IDXC.object_id = OBJ.object_id 
		INNER JOIN sys.schemas SCH ON SCH.schema_id = OBJ.schema_id
		INNER JOIN sys.indexes IDX ON (IDXC.object_id = IDX.object_id AND IDXC.index_id = IDX.index_id)
		INNER JOIN sys.columns COL ON (IDXC.column_id = COL.column_id AND OBJ.object_id = COL.object_id)
		WHERE (OBJ.type = 'U' OR OBJ.type = 'V') AND COL.name = @NOM_CHAMP

---------------------------------------------------------------------------------------------------------------------------------------
-- Déclaration du Curseur sur la liste des indexes
OPEN TESTCURSEUR 
FETCH NEXT FROM TESTCURSEUR INTO @SQL
   
WHILE (@@FETCH_STATUS >= 0)
	BEGIN 
		PRINT (@SQL)
		--EXECUTE (@SQL)

		FETCH NEXT FROM TESTCURSEUR 
		INTO @SQL 
	END

---------------------------------------------------------------------------------------------------------------------------------------
-- Fermeture du Curseur 
CLOSE TESTCURSEUR 
  
-- Libération de la mémoire prise par le Curseur 
DEALLOCATE TESTCURSEUR

---------------------------------------------------------------------------------------------------------------------------------------

Conclusion :


Bon coding

Romelard Fabrice [MVP]

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.