Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/08/2008, 17h34   #1
Nouveau Membre du Club
 
Inscription : octobre 2003
Messages : 108
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 108
Points : 30
Points : 30
Par défaut Problème variable Curseur

Salut tout le monde

Je viens de créer un curseur qui devrait supprimer tous les index de plusieurs tables.

j'ai systématiquement une erreur, il me dit qu'une variable n'est pas déclarée.
Cette erreur intervient quand je veux faire le DROP INDEX, alors que si je remplace DROP INDEX par PRINT je n'ai pas l'erreur.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
DECLARE @nomTab varchar(50)
DECLARE @nomIndex varchar(100)
 
DECLARE dropIndex CURSOR 
FOR   
	SELECT DISTINCT sysindexes.name, sysObjects.name
	FROM sysindexes 
	INNER JOIN sysobjects ON sysObjects.id=sysindexes.id
	INNER JOIN syscolumns ON syscolumns.id=sysobjects.id
	WHERE (sysObjects.name LIKE 'C\_%' ESCAPE '\' OR sysObjects.name LIKE 'A\_%' ESCAPE '\' )
	AND indid >=1 
OPEN dropIndex
 
FETCH dropIndex INTO @nomIndex,@nomTab
WHILE @@FETCH_STATUS = 0
BEGIN
   DROP INDEX @nomTab+'.'+@nomIndex
--PRINT @nomTab+'.'+@nomIndex
   FETCH NEXT FROM dropIndex INTO @nomIndex,@nomTab
END
 
CLOSE dropIndex
DEALLOCATE dropIndex
Version SQL SERVER 2000

Si quelqu'un a une idée

Merci par avance
dsr57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2008, 19h51   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 793
Points : 17 793
Votre requête serait mieux écrite ainsi :

Code :
1
2
3
4
5
	SELECT DISTINCT i.name, o.name
	FROM sysindexes i
	INNER JOIN sysobjects o ON o.id=i.id
	INNER JOIN syscolumns c ON c.id=o.id
	WHERE (o.name LIKE 'C\_%' ESCAPE '\' OR o.name LIKE 'A\_%' ESCAPE '\' )
Ensuite les noms des objets peuvent aller jsqu'à 128 caractères, donc :
Code :
1
2
DECLARE @nomTab   varchar(128)
DECLARE @nomIndex varchar(128)
Pour continuer, si dans vos noms d'objet ily a des caractères interdits : blanc, accents, etc... Il faut les mettre en crochets.

Enfin, si votre index est sous-jacent à une PRIMARY KEY ou une contraintes d'unicité, vous ne pouvez pas le supprimer comme cela. pour ce faire sil faut supprimer la contrainte, ce qui entraine de facto la suppression de l'index.

Pour terminer vous avez supposé que tous vos objets figurent dans le schéma dbo. Si ce n'est pas le cas, il faut rajouter dans votre script la gestion du schéma.

D'autre part, vous ne pouvez le faire qu'avec du SQL dynamique :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
DECLARE @nomTab   varchar(128)
DECLARE @nomIndex varchar(128)
DECLARE @SQL      varchar(8000)
 
DECLARE dropIndex CURSOR 
FOR   
	SELECT DISTINCT i.name, o.name
	FROM   sysindexes i
	INNER  JOIN sysobjects o ON o.id=i.id
	INNER  JOIN syscolumns c ON c.id=o.id
	WHERE  (o.name LIKE 'C\_%' ESCAPE '\' OR o.name LIKE 'A\_%' ESCAPE '\' )
          AND  i.name NOT IN (SELECT *,CONSTRAINT_NAME 
                             FROM   INFORMATION_SCHEMA.TABLE_CONSTRAINTS
                             WHERE  TABLE_NAME = o.name)
	  AND  indid >=1 
OPEN dropIndex
 
FETCH dropIndex INTO @nomIndex,@nomTab
WHILE @@FETCH_STATUS = 0
BEGIN
 
   SET @SQL = 'DROP INDEX [' + @nomTab + '].[' + @nomIndex +' ]';
   EXEC (@SQL);
   IF @@ERROR = 0
      PRINT @SQL;
   ELSE
      PRINT 'INDEX ' + @nomIndex ' non supprimé sur la TABLE ' + @nomTab;
   FETCH NEXT FROM dropIndex INTO @nomIndex,@nomTab
 
END
 
CLOSE dropIndex
DEALLOCATE dropIndex

pas testé. A vous de jouer.

Pour obtenir les méta données d'info des index et contraintes, vous pouvez utiliser les vues que je viens de publier : http://blog.developpez.com/sqlpro?ti...ets_sql_server

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h03.


 
 
 
 
Partenaires

Hébergement Web