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 :

XML dans SQL Server - Compter le nombre de noeuds


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 58
    Par défaut XML dans SQL Server - Compter le nombre de noeuds
    Bonjour,

    Je débute en SQL Server et XML.

    J'ai 2 champs au format XML qui me permettent d'identifier les mises à jour de données (Colonne ancienne valeur et une colonne nouvelle valeur).

    Il va me falloir comparer les deux attributs pour identifier ce qui a changé.

    Auriez-vous du code exemple ?

    A défaut, est-ce-que quelqu'un saurait me dire comment compter le nombre de noeud et attributs ?

    Merci beaucoup d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    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 : 22 009
    Billets dans le blog
    6
    Par défaut
    Utilisez la fonction XQuery count. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     count(/toto/tata:elementA)
    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/ * * * * *

  3. #3
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 58
    Par défaut Merci mais ....
    Merci mais quand on ne connaît pas la structure à l'avance, les choses se compliquent ....

    Et surtout, comment inclure cette instruction dans une commande SQL Server ?

    En fait, mes données sont stockées dans des champs XML.
    Une colonne OLDVALUE XML et une colonne NEWVALUE XML.

    J'ai besoin de les comparer et de mettre en évidence les différences :
    Quel attribut est différent et quelle est la valeur avant (OLDVALUE) et après (NEWVALUE).

    Merci beaucoup d'avance.


  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    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 : 22 009
    Billets dans le blog
    6
    Par défaut
    Donnez un exemple du XML...

    Vous pouvez utiliser la fonction fn:node-name()

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

  5. #5
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 58
    Par défaut
    Voilà la requête que je lance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select H.*
    	from XX.Historisation AS H
    Et voilà le résultat :

    Colonne OldValue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ItemMaster>
      <ItemMaster>
        <ID_IM>E9812B30-935D-42F9-A174-5C82815E64AD</ID_IM>
        <Reference>TESTSMA4</Reference>
        <Description>Test SMA 4 - Description</Description>
        <IMLOG>36</IMLOG>
      </ItemMaster>
    </ItemMaster>
    Colonne NewValue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <ItemMaster>
      <ItemMaster>
        <ID_IM>E9812B30-935D-42F9-A174-5C82815E64AD</ID_IM>
        <Reference>TESTSMA4</Reference>
        <Description>Test SMA 4 - Description ++</Description>
        <IMLOG>36</IMLOG>
      </ItemMaster>
    </ItemMaster>
    Via une fonction SQL, je voudrais mettre en évidence le fait que la valeur de la description change entre le old et le new.

    A noter que cette table d'historisation est utilisée pour plusieurs tables.
    Donc la structure de l'XML diffère à chaque fois.

    C'est pour cela que j'ai besoin de déterminer le nombre de nœuds.

    Merci d'avance.

  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
    22 009
    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 : 22 009
    Billets dans le blog
    6
    Par défaut
    Déjà vous avez un problème car des nœuds de hiérarchies différentes ont le même nom ce qui n'est pas très bon ! L'un devrait être au pluriel par exemple et l'autre au singulier.

    Ce serait aussi important que vous respectiez la charte de postage en donnant le DDL de vos tables et le jeu d'essais ! A lire : https://www.developpez.net/forums/d9...vement-poster/

    Donc, voici le jeu d'essai qui m'a servit :
    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
    CREATE TABLE Historisation (ID INT, OldValue XML, NewValue XML);
     
    INSERT INTO  Historisation VALUES (1,
    '<ItemMaster>
      <ItemMaster>
        <ID_IM>E9812B30-935D-42F9-A174-5C82815E64AD</ID_IM>
        <Reference>TESTSMA4</Reference>
        <Description>Test SMA 4 - Description</Description>
        <IMLOG>36</IMLOG>
      </ItemMaster>
    </ItemMaster>',
    '<ItemMaster>
      <ItemMaster>
        <ID_IM>E9812B30-935D-42F9-A174-5C82815E64AD</ID_IM>
        <Reference>TESTSMA4</Reference>
        <Description>Test SMA 3 - Description ++</Description>
        <IMLOG>38</IMLOG>
      </ItemMaster>
    </ItemMaster>');
    Et la requête finale :

    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
    WITH 
    T1 AS
    (
    SELECT H.ID, O.x.value('local-name(.)', 'varchar(128)') AS PRMO,
                 O.x.value('(.)[1]', 'varchar(50)') AS VALO
    FROM   Historisation AS H
           CROSS APPLY OldValue.nodes('/ItemMaster/ItemMaster/*') AS O(x)
    ),
    T2 AS
    (
    SELECT H.ID, N.x.value('local-name(.)', 'varchar(128)') AS PRMN,
                 N.x.value('(.)[1]', 'varchar(50)') AS VALN
    FROM   Historisation AS H
    	   CROSS APPLY NewValue.nodes('/ItemMaster/ItemMaster/*') AS N(x)
    )
    SELECT *
    FROM   T1
           INNER JOIN T2
    	         ON T1.ID = T2.ID AND T1.PRMO = T2.PRMN AND T1.VALO <> T2.VALN ;
    Il serait intéressant que vous vous formiez a XQuery/XPath en sus de SQL et de son intégration au sein des requêtes SQL !

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

Discussions similaires

  1. Prise en charge du XML dans SQL Server
    Par Hinault Romaric dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 01/06/2010, 10h46
  2. Réponses: 0
    Dernier message: 29/03/2010, 17h39

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