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 :

Convertir un champ XML vers un format relationnel


Sujet :

Développement SQL Server

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Convertir un champ XML vers un format relationnel
    Bonjour,

    Je souhaiterais savoir s'il est possible (et si oui comment ) de créer une requête SQL capable de convertir en ensemble de lignes possédant une colonne nvarchar(max) contenant du XML sous cette forme:
    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
    
    <ArrayOfBedControlResult>   
    
    <BedControlResult>
    <Location>S07Robot</Location> <Name>Callage sur cible X1</Name> <MeasureData>0</MeasureData> <Status>1</Status> <IsCorrected>false</IsCorrected> <Notes>Calib_X1 : OK</Notes>
    </BedControlResult> <BedControlResult>
    <Location>S07Robot</Location> <Name>Callage sur cible X2</Name> <MeasureData>0</MeasureData> <Status>1</Status> <IsCorrected>false</IsCorrected> <Notes>Calib_X2 : OK</Notes>
    </BedControlResult> ... ...
    </ArrayOfBedControlResult>
    vers un format relationnel traditionnel :


    Location | Name | MeasureData | Status | IsCorrected | Notes
    ---------------------------------------------------------------
    S07Robot | Callage sur cible X1 | 0 | 1 | false | Calib_X1 : OK
    S07Robot | Callage sur cible X2 | 0 | 1 | false | Calib_X2 : OK
    ...
    ...
    Mes connaissances en xpath sont très limitées ... pour l'instant je suis parti sur une requête de ce type pour déjà tester sur un seul champ (Location) mais cela ne retourne rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Convert(XML,cp.Data).query('for $Location in /root/ArrayOfBedControlResult/BedControlResult/Location return $Location')  as Result FROM Core_BaseCustomProperty  cp
    
    Si quelqu'un a une idée je suis preneur !

    Merci d'avance !

    Yann.

  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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Pour obtenir de bonnes performances, changez le type de votre colonne en XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE Core_BaseCustomProperty
    ALTER COLUMN Data XML
    Vous pouvez de plus valider votre colonne XML à l'aide une schéma XML.
    Pour enregistrer votre schéma, utilisez l'instruction CREATE XML SCHEMA COLLECTION.
    Une fois cela fait, vous pourrez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE Core_BaseCustomProperty
    ALTER COLUMN Data XML (CONTENT dbo.monSchemaXML)
    Vous pouvez en plus ajouter un index XML sur cette colonne à l'aide de l'instruction CREATE XML INDEX

    Voici un exemple pour ce que vous demandez :

    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
    DECLARE @xml XML
    SET @xml = '<ArrayOfBedControlResult>
        <BedControlResult>
            <Location>S07Robot</Location>
            <Name>Callage sur cible X1</Name>
            <MeasureData>0</MeasureData>
            <Status>1</Status>
            <IsCorrected>false</IsCorrected>
            <Notes>Calib_X1 : OK</Notes> 
        </BedControlResult>
        <BedControlResult>
            <Location>S07Robot</Location>
            <Name>Callage sur cible X2</Name>
            <MeasureData>0</MeasureData>
            <Status>1</Status>
            <IsCorrected>false</IsCorrected>
            <Notes>Calib_X2 : OK</Notes>
        </BedControlResult>
    </ArrayOfBedControlResult>'
     
    SELECT BedControlResult.value('./Location[1]', 'VARCHAR(10)') Location,
    		BedControlResult.value('./Name[1]', 'VARCHAR(50)') Name,
    		BedControlResult.value('./MeasureData[1]', 'INT') MeasureData,
    		BedControlResult.value('./Status[1]', 'BIT') [Status],
    		BedControlResult.value('./IsCorrected[1]', 'VARCHAR(5)') IsCorrected,
    		BedControlResult.value('./Notes[1]', 'VARCHAR(50)') Notes
    FROM @xml.nodes('/ArrayOfBedControlResult/BedControlResult') TMP (BedControlResult)
    @++

  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 901
    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 901
    Points : 53 143
    Points
    53 143
    Billets dans le blog
    6

  4. #4
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci mille fois pour la rapidité et la qualité de ces informations qui m'ont permis d'obtenir le résultat souhaité... Je suis impressionné !


    Yann.

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

Discussions similaires

  1. [XML] convertir un fichier xml vers rdf triples
    Par ameni88 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 28/04/2017, 17h15
  2. convertir un fichier DVR vers autre format
    Par iliesss dans le forum Vidéo
    Réponses: 0
    Dernier message: 18/01/2012, 11h49
  3. [SGBDR] oracle: d'un fichier XML vers des tables relationnelles
    Par medos86 dans le forum XQUERY/SGBD
    Réponses: 4
    Dernier message: 24/03/2011, 16h05
  4. [DOM] [XSL] Convertir un fichier XML vers un fichier CSS
    Par Invité dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 23/03/2007, 10h49
  5. [SQL2K] Convertir un champ Char Vers un champ Date
    Par Sidi-Bou dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 29/01/2007, 08h45

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