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 :

Comment ouvrir un curseur avec une variable dans la requete


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Comment ouvrir un curseur avec une variable dans la requete
    erreur obtenue : variable assignment is not allowed in a cursor declaration.

    Exemple:
    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
    --Fait une boucle pour savoir si le maitre Promety de destination à déja une liste avec le nom 
    	DECLARE liste_source CURSOR local FOR
    		SELECT @ReqExec = 'SELECT nom, nom_html, description, isDefault 
    		FROM ' + @bd_source + 'partenaire_type pt
    		INNER JOIN ' + @bd_source + 'type_mailing_CIperso t ON t.fk_mailing_CIperso = ' + @fk_mailing + ' AND pt.id = t.fk_partenaire_type AND t.fk_partenaire_type IS NOT NULL
    		WHERE pt.fk_partenaire_menu = ' + @id_partenaire_source
    		EXEC(@ReqExec)
     
    		--SELECT nom, nom_html, description, isDefault FROM partenaire_type where fk_partenaire_menu=@id_partenaire_source
     
     
    		OPEN liste_source
    			FETCH NEXT FROM liste_source INTO @nom, @nom_html, @description, @isDefault
    			WHILE @@FETCH_STATUS = 0  BEGIN
     
    				--Si le maitre Promety de destination à déja une liste qui a comme défaut 1
    				IF @isDefaultUn = 1 SET @isDefault = 0
     
     
    				SELECT @ReqExec = 'SELECT NULL FROM ' + @bd_destination + 'partenaire_type WHERE fk_partenaire_menu = ' + CAST(@id_partenaire_destination AS VARCHAR(12)) + ' AND nom = ' + @nom
    				EXEC(@ReqExec)
    				--Si il existe pas de liste avec ce nom pour le maitre Promety de destination on la crée
    				IF @@ROWCOUNT = 0 BEGIN
    					SELECT @ReqExec = 'INSERT ' + @bd_destination + 'partenaire_type(fk_partenaire_menu, nom, nom_html, description, isDefault) VALUES (' + CAST(@id_partenaire_destination AS VARCHAR(12)) + ', ' + @nom + ', ' + @nom_html + ', ' + @description + ', ' + @isDefault + ')'
    					EXEC(@ReqExec)
    				END	
     
    				FETCH NEXT FROM liste_source INTO @nom, @nom_html, @description, @isDefault
    			END
    		CLOSE liste_source
    	DEALLOCATE liste_source

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Il me semble que l'erreur est claire : vous écrivez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @ReqExec = 'SELECT nom, ...
    Or l’affectation d'une variable dans la spécification d'un curseur n'est pas permise, puisqu'il s'agit de définir un jeu de données sur lequel on va boucler pour réaliser quelque chose.

    Cela étant, les curseurs sur une base de données SQL est ce qu'il y a de plus contre-performant, pour la simple et bonne raison que SQL est un langage ensembliste, et que les curseurs ne le sont pas.
    Par voie de conséquence, les moteurs de bases de données relationnelles SQL sont optimisés pour traiter les données dans leur ensemble.

    La seconde abomination que vous commettez est de ne pas paramétrer vos requêtes : pour chaque requête qui aurait été créée avec le curseur, un plan de requête aurait été à compiler (ce qui est consommateur de CPU) et il y a peu de chance qu'un tel plan soit réutilisé, puisque la recherche de plans dans le cache de plans de fait sur la chaîne de requête. donc pour chaque changement de valeur de vos paramètres, un nouveau plan est généré.

    On peut tout à fait paramétrer des requêtes dynamique SQL en remplaçant EXEC(@sql) par EXEC sp_executesql @sql, N'<parametres>', comme je l'ai montré dans ce post

    @++

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/11/2009, 11h14
  2. Réponses: 5
    Dernier message: 09/07/2008, 17h04
  3. Réponses: 2
    Dernier message: 16/11/2006, 13h28
  4. Ou et comment insérer une variable dans la requete?
    Par forzaxelah dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/05/2006, 11h33
  5. Ouvrir un curseur avec une requête paramétrée?
    Par nnj dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/07/2005, 14h12

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