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 :

Update et affectation select dans variable


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 22
    Points : 13
    Points
    13
    Par défaut Update et affectation select dans variable
    Bonjour,

    alors voilà, j'ai une procédure stockée dans laquelle j'exécute un update.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare @id int
    select @id = cbMarq from TARIF WHERE (AR_Ref=@AR_Ref) AND (BorneSup=@BorneSup)
     
    UPDATE   TARIF
      SET PrixNet =@PrixNet
      WHERE cbMarq=@id
    Ce qui me pose problème est au niveau de la variable @id: je ne comprends pas pourquoi la mise à jour ne se fait pas alors que si je fais
    select cbMarq=@id j'ai bien la valeur souhaité qui m'est retourné (par exemple '39123')
    Et si j'affecte à cbMarq une valeur en dur (par exemple cbMarq='39123'), l'update fonctionne
    Je sais plus trop quoi faire pour que ça marche...

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    a mon avis 2 cas possibles

    ta valeur n'est pas unique => essaies le code ci dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare @id int
    SELECT top 1 @id = cbMarq FROM TARIF WHERE (AR_Ref=@AR_Ref) AND (BorneSup=@BorneSup)
     
    UPDATE   TARIF
      SET PrixNet =@PrixNet
      WHERE cbMarq=@id
    ou alors cbMarq n'est pas un entier !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    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 862
    Points : 53 013
    Points
    53 013
    Billets dans le blog
    6
    Par défaut
    postez le code entier de votre PS :
    CREATE PROCEDURE....

    A +

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Arf, ben si justement cbMarq est unique et c'est un entier

    Sinon voilà ma procédure :
    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
    CREATE PROCEDURE UpdateTarifs 
    (	@TQ_PrixNet numeric(24, 6),
    	@cbMarq int,
    	@TQ_BorneSup numeric(24,6),
    	@AR_Ref varchar(19)
    ) AS
    -- cet update là fonctionne
    UPDATE  F_TARIFQTE
      SET TQ_PrixNet = @TQ_PrixNet
      WHERE (cbMarq = @cbMarq) AND (TQ_BorneSup = @TQ_BorneSup)
    
    declare @id int
    select @id = cbMarq from F_TARIFQTE WHERE (AR_Ref=@AR_Ref) AND (TQ_BorneSup = @TQ_BorneSup) AND (RIGHT(F_TARIFQTE.TQ_RefCF, 1) = '3')
    
    -- c'est ici que ça coince (en rouge):
    UPDATE    F_TARIFQTE 
      SET TQ_PrixNet =@TQ_PrixNet+(Select TT_TauxTransp from F_TAUXTRANSP Where AC_Categorie ='3' AND TT_Risq='0' AND TT_BorneSup = @TQ_BorneSup)
      WHERE (cbMarq=@id)
    En fait pour expliquer simplement, le premier update modifie le Prix de base d'un article,
    le deuxième update met à jour, pour la même référence article (mais destiné à l'étranger) le prix en appliquant un taux de majoration
    (et ceux sont donc bien deux lignes différentes qui sont modifiées)

    Pour info: J'ai testé chaque ligne une par une et il n'y a pas d'erreur sauf sur la dernière, c'est là qu'est le problème. Quand dans la même procédure je mets le cbMarq en dur, l'update se fait bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE    F_TARIFQTE 
      SET TQ_PrixNet =@TQ_PrixNet+(Select TT_TauxTransp from F_TAUXTRANSP Where AC_Categorie ='3' AND TT_Risq='0' AND TT_BorneSup = @TQ_BorneSup)
      WHERE (cbMarq=12345)

  5. #5
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    rajoutes:
    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
     
    CREATE PROCEDURE UpdateTarifs 
    (	@TQ_PrixNet numeric(24, 6),
    	@cbMarq int,
    	@TQ_BorneSup numeric(24,6),
    	@AR_Ref varchar(19)
    ) AS
    -- cet update là fonctionne
    UPDATE  F_TARIFQTE
      SET TQ_PrixNet = @TQ_PrixNet
      WHERE (cbMarq = @cbMarq) AND (TQ_BorneSup = @TQ_BorneSup)
     
    declare @id int
    select @id = cbMarq from F_TARIFQTE WHERE (AR_Ref=@AR_Ref) AND (TQ_BorneSup = @TQ_BorneSup) AND (RIGHT(F_TARIFQTE.TQ_RefCF, 1) = '3')
     
    if (isnull(@id,-1)=-1
    raiserror('@id null...',16,1)
     
    if not exist(select 1 from  F_TARIFQTE  where cbMarq=@id)
    raiserror('@id inconnu...',16,1)
     
     
    -- c'est ici que ça coince (en rouge):
    UPDATE    F_TARIFQTE 
      SET TQ_PrixNet =@TQ_PrixNet+(Select TT_TauxTransp from F_TAUXTRANSP Where AC_Categorie ='3' AND TT_Risq='0' AND TT_BorneSup = @TQ_BorneSup)
      WHERE (cbMarq=@id)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Merci pour cette réponse, mais je pense que le problème ne vient pas de là car lorsque dans l'analyseur de requête j'exécute le code suivant, j'ai bien la valeur cbMarq attendue qui m'est retournée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    declare @id int
    select @id = cbMarq from F_TARIFQTE WHERE (AR_Ref='C01050') AND (TQ_BorneSup = '.999') AND (RIGHT(F_TARIFQTE.TQ_RefCF, 1) = '3')
    select cbMarq=@id

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Ah ben en fait t'avais pas tout à fait tord serge0934 !

    il n'y avait pas d'erreur dans le code de ma procédure (mais dans l'affectation des variables dans la partie vb.net)

    enfin, merci à ceux qui m'ont aidé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. psql : resultat select dans variable ?
    Par Débéa dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 11/05/2010, 12h04
  2. affecter le resultat d'un select dans une variable
    Par ricoree78 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/06/2009, 14h48
  3. Inclure un SELECT dans une requète Update
    Par carolinebelle dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/07/2005, 14h19
  4. resultat requete SQL d'un select dans variable vb
    Par seb_06 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 11/10/2004, 16h29
  5. [Sybase] résultat d'un select dans une variable
    Par stoz dans le forum Sybase
    Réponses: 2
    Dernier message: 14/09/2004, 14h28

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