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

Langage SQL Discussion :

Update variable bizarre


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 144
    Points : 68
    Points
    68
    Par défaut Update variable bizarre
    Bonjour à tous,

    Voici mon problème
    J'ai une table client avec plusieurs colonnes et une table modification qui m'indique quel client a été modifié et quel champ
    j'ai imagine une requete du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update  client C
    set (select M.champ_modif from table_modif M where M.id=c.ID)
    Values  (select B.new_value from table_modif B where B.id=c.ID)
    Mais je sais que ca n'a aucune chance de marcher

    Cordialement,

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    En effet, ça ne fonctionnera pas car la syntaxe de votre requete est invalide, SET doit faire référence à des colonnes de la table à mettre à jour.

    La bonne syntaxe est du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Update ma_table
    set col1=val1, col2=val2...
    where...
    Si vous voulez utiliser une requête imbriquée pour alimenter vos colonnes, ça donne donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Update ma_table
    set col1=(select colx from table2 where...)
       ,col2=val2...
    where...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    Oui mais dans votre exemple je ne connais pas col1 à l'avance, c'est bien mon probleme , c'est que je ne connais pas à l'avance quel colonne je dois modifier

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Mais quel est le but de la manœuvre ? si toutes les colonnes de la table sont modifiées, vous allez créer autant d'ajouts dans votre mouchard qu'il y a de colonnes dans la table modifiée ?
    C'est acceptable si la table a très peu de colonnes et qu'elle est peu modifiée, mais c'est quand même pas top comme archi, et si les MàJ sont nombreuses vous allez multiplier les i/o sur votre table mouchard.
    Une possibilité : créer un trigger dans lequel vous comparez toutes les valeurs old et new, colonne par colonne, et vous stockez en une seule fois dans la table mouchard l'ensemble des colonnes impactées ou non (avec un indicateur disant si modif ou non + une colonne supplémentaire donnant l'horodatage de MàJ + une colonne donnant le user de MàJ)
    Autre possibilité, beaucoup plus classique, faire une copie avant MàJ par un trigger dans une table bis

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    en fait j'ai extrait ma base client de mon erp, et ensuite je vais extraire la derniere journee de ma table modif tous les soirs,
    dans cette table modif il peut y avoir autre chose que des clients
    ex
    id-modif table_modif champ_modif new_value

    donc je n'ai pas trop le choix

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    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 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    Quel est votre besoin fonctionnel ? parce qu'il existe sans doute des techniques ou des outils pour faire ce que vous voulez...

    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/ * * * * *

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    en fait j'ai extrait ma base client de mon erp, maintenant je vais extraire la derniere journee de ma table modif tous les soirs,
    à partir de cette table modif je dois modifier ma base client tous les jours.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Edit : vous voulez resynchroniser une base de données externe à l'ERP à partir des modifs faites dans l'ERP c'est bien ca ?
    Le report des mises à jour concerne quel volume journalier et quelle proportion par rapport à votre total ?
    Et aussi quels sont les SGBD source et cible ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    j'ai une centaine de modif pour 100000 clients

    je les extrais de mon erp en .txt et je les mets dans sql server

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Et pourquoi n'utilisez vous pas simplement un trigger pour mettre à jour en mode synchrone, votre base client n'est pas accessible lorsque l'ERP est mis à jour ?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    je n'ai pas accès à la base direct de l'erp, je suis obligé d'extraire en .txt

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    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 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par oupepasa Voir le message
    en fait j'ai extrait ma base client de mon erp, maintenant je vais extraire la derniere journee de ma table modif tous les soirs,
    à partir de cette table modif je dois modifier ma base client tous les jours.
    Il suffit alors de mettre en place un outil comme CDC (Change Data Capture) ou Change Tracking pour suivre l'évolution des données de certaines tables et reporter leurs évolutions dans la base cible.
    À lire sur CDC : https://en.wikipedia.org/wiki/Change_data_capture
    Et sur Change Tracking : https://msdn.microsoft.com/en-us/library/cc280462.aspx

    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/ * * * * *

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    Comment suivre l'evolution d'une table auquel je n'ai pas accès??

  14. #14
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Pourquoi ne pas construire la requête dynamiquement (en SQL ou autre) ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    declare @query varchar(max);
     
    select @query = 'update client C set ' + m.champ + ' values (' + b.new + ');'
    from table_modif;
     
    execute @query;

    Il faudra juste :
    - Faire gaffe aux éventuels problèmes d'injection
    - Faire en sorte que le type de b.new soit correctement géré (varchar, int, date, etc.)
    - Echapper correctement les quotes si besoin dans les varchar
    On ne jouit bien que de ce qu’on partage.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2008
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    faudra que j'essaie cela quand je retravaillerai sur cette partie , merci pour votre aide, cela m'a l'air très intéressant.

    edit: c'est meme parfait mais effectivement vu toute les choses à respecter je vais trouver une autre méthode mais merci quand meme

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

Discussions similaires

  1. Comportement bizarre de variables d'applications
    Par ahage4x4 dans le forum ASP
    Réponses: 2
    Dernier message: 14/11/2005, 11h51
  2. [MySQL] Update de variable
    Par tyarak dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/10/2005, 02h59
  3. [CGI]problème update de variable de session
    Par LE NEINDRE dans le forum Web
    Réponses: 1
    Dernier message: 18/10/2005, 10h50
  4. Réponses: 11
    Dernier message: 07/04/2005, 10h20
  5. UPDATE avec des variables Delphi ...
    Par Kokito dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/03/2004, 22h35

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