IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Problème variable Curseur


Sujet :

Développement SQL Server

  1. #1
    Rédacteur/Modérateur

    Avatar de dsr57
    Homme Profil pro
    Analyste programmeur senior
    Inscrit en
    Octobre 2003
    Messages
    1 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Analyste programmeur senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 139
    Points : 4 681
    Points
    4 681
    Billets dans le blog
    22
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    ------------------------------------------------------------------------------------------------------------------------------------------
    Mon message vous a aidé, pensez à remercier . La discussion est résolue, n'oubliez pas le tag
    ------------------------------------------------------------------------------------------------------------------------------------------
    Site perso : Formation, Expérience, Réalisations, ...
    Blog : Le Blog de DSR57 - Programmation WinDev

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Votre requête serait mieux écrite ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [javascript] Problème variable globale !!!!
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 08/08/2005, 16h41
  2. [MSDE] Problème de curseur dans une SP
    Par papouAlain dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/07/2005, 11h28
  3. [Rave report 5.1.3][delphi 7] Probléme variable PIVar
    Par GILLESKLEIN dans le forum Rave
    Réponses: 2
    Dernier message: 05/02/2005, 15h27
  4. [Trigger] Problème de curseur
    Par Superstivix dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/06/2004, 10h30
  5. problème variable extern
    Par HeKaz dans le forum C
    Réponses: 14
    Dernier message: 08/01/2003, 01h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo