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 :

champs XML jointure


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut champs XML jointure
    Bonjour,

    Actuellement, j'ais une table etape avec un champs XML (et_opts) qui ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <XmlEtapeOption xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Filtres>
        <FiltreEtape>
          <Libelle>Etape indipensable de Col</Libelle>
          <Selected>true</Selected>
          <Value>1016</Value>
          <Visible>true</Visible>
        </FiltreEtape>
      </Filtres>
    </XmlEtapeOption>
    j'ai besoin de faire une requete du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select champs ... , et_opts from etape
    Je dois cependant traduire le champs XML "Libelle" (jointure sur une autre table à partir de du champs XML "Value")

    Est-ce possible dans une requête ? comment ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Si le but est de récupérer dans et_opts la valeur de l'élément Libelle et de joindre la colonne et_opts avec une colonne d'une autre table alors la réponse est oui.

    Par exemple quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH CTE
    AS
    (
     SELECT T.x.value('.', 'VARCHAR(100)') AS Libelle
     FROM etape
     CROSS APPLY etape.et_opts.nodes('//Libelle') AS T(x)
    )
    SELECT col ....
    FROM CTE
     JOIN autreTable
      ON CTE.Libelle = autreTable.autreColonne
    ++

  3. #3
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Merci pour la réponse,

    Ce n'est pas exactement ce que je souhaite faire. et_opts est dé-sérialisé dans le code, je voulais récupérer et_opts avec le noeuds Libelle traduit directement depuis la base de données.

    Je pense que ce n'est pas possible...

    Mais au cas ou :

    Table de traduction : Lignetrad
    champs : lg_num (id), lg_english, lg_français

    La jointure se fait entre le noeuds "Value" du champs et_opts et lg_num de la table lignetrad.
    lg_english et lg_francais sont les traductions du noeuds "Libelle".

    Le choix de la langue se fait par une variable à la procédure stockée (@langue -> 0 : francais, 1 : anglais)

    Si ce n'est pas possible je ferais comme ceci :
    1 - je récupérerais et_opts + libellé traduit,
    2 - je dé-sérialiserais et_opts
    3 - j'appliquerais le libellé traduit à la propriété Libellé de mon objet.

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Ok.

    Petite modification pour faire la jointure en fonction de l'élément value et la table lignetrad :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH CTE
    AS
    (
     SELECT T.x.value('.', 'VARCHAR(100)') AS value
     FROM #etape
     CROSS APPLY et_opts.nodes('/XmlEtapeOption/Filtres/FiltreEtape/Value') AS T(x)
    )
    SELECT *
    FROM CTE
     JOIN #lignetrad 
      ON CTE.value = #lignetrad.lg_num
    En fonction de ta variable @langue il suffira d'utiliser un CASE pour récupérer la bonne langue

    ++

    ++

Discussions similaires

  1. [XQuery] Base Données XML : Jointure entre les fichiers
    Par Nadah dans le forum XQUERY/SGBD
    Réponses: 3
    Dernier message: 27/04/2007, 10h33
  2. Quel SGBD gratuit sachant gérer nativement des champs XML ?
    Par KLnikita dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 27/02/2007, 13h38
  3. [Dates] PHP et les champs XML
    Par nicaud dans le forum Langage
    Réponses: 1
    Dernier message: 03/01/2007, 22h26
  4. Problème requete sur champs xml
    Par fred6655 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/09/2006, 14h19
  5. Root pour champ XML
    Par Sylvain James dans le forum XMLRAD
    Réponses: 2
    Dernier message: 29/08/2005, 17h26

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