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

MS SQL Server Discussion :

Éviter que une variable soit évaluée.


Sujet :

MS SQL Server

  1. #1
    Invité
    Invité(e)
    Par défaut Éviter que une variable soit évaluée.
    J'explique le problème tout simplement :

    J'essaie dans une procédure stoquée, de setter une colone par injection, tout simplement... le problème est que quand je set le nom de la colone, la variable est évaluée et est donc remplacée par la valeur de la colone au lieu de la valeur de la variable.

    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
     
    CREATE PROCEDURE sp_update_location1
    	@fld varchar(25),
    	@value varchar(25),
    	@id int
    AS
     
    BEGIN
    	UPDATE  dbo.Locations  SET @fld = @value
    	    	WHERE [ID Location] = @id
     
    	PRINT @@ERROR
    	PRINT @fld
    	PRINT @value
    	PRINT @id
     
    	SELECT * FROM dbo.Locations WHERE [ID Location] = @id	
    END
     
    exec sp_update_location1 'Montant Paiement', 536.5, 35
    Le résultat dans les messages :
    (1 row(s) affected)
    0
    536.5
    536.5
    35

    (1 row(s) affected)

    Et la colone Montant Paiement reste inchangée. De ce fait j'en ai venu à comprendre que le update fait en fait un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     UPDATE  dbo.Locations  SET 536.5 = 536.5
    	    	WHERE [ID Location] = @id
    (sauf erreur de ma part)

    Y a t'il une manière de faire que @fld soit évalué comme [Montant Paiement] et non pas la valeur de la colone ?

  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 : 43
    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
    Par défaut
    Bonjour,

    Je ne comprends pas pourquoi tu n'as pas écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE  dbo.Locations
    SET [MONTANT PAIEMENT] = @value
    WHERE [ID Location] = @id

  3. #3
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    Même avis que Elsuket pour résoudre ton problème. Mais je suppose que tu veux passer le nom de la colonne en paramètre, vu que tu demandes :
    Y a t'il une manière de faire que @fld soit évalué comme [Montant Paiement] et non pas la valeur de la colone ?
    Il me semble que ça apparait avec SQL Serveur 2008.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Une soltuion possible a ton problème est d'utiliserune requêtes dynamiques pour effectuer ta mise à jour.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DECLARE @query VARCHAR(8000)
    SET @query = 'UPDATE  dbo.Locations  SET ['+@fld+'] = '+@value+' WHERE [ID Location] = '+CONVERT(VARCHAR(10),@id)
    EXECUTE(@query)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Intéressant comme piste en utilisant les requêtes dynamiques.

    Cependant si je fais "Print @fld" ça me donne la valeur de la colone et non pas la valeur de la variable (montant paiement dans ce cas) avec une requête dynamique ça utiliserait la valeur de la variable?

    J'essaie tout ça ce soit je vais reposter ensuite pour vous mettre au courant.

  6. #6
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    Le problème des requêtes dynamique, c'est que ce n'est pas compilé, donc c'est plus lent. Mais sinon, c'est effectivement une solution à ton problème 8o)

Discussions similaires

  1. Réponses: 15
    Dernier message: 10/03/2014, 19h40
  2. Réponses: 2
    Dernier message: 21/12/2012, 21h26
  3. éviter qu'une phrase soit découpé + impression
    Par dicyz dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 26/04/2012, 10h32
  4. Réponses: 10
    Dernier message: 23/10/2006, 09h43

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