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 : modify et insertion de plusieurs éléments


Sujet :

Développement SQL Server

  1. #1
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut XML : modify et insertion de plusieurs éléments
    Bonjour,

    Question d'ordre technique sur la modification d'une colonne XML via l'insertion d'éléments. Est-il possible d'insérer plusieurs éléments en une fois, sachant que les éléments sont issu du résultat d'une requête.

    En gros, j'ai un élément <root/>, une requête qui me retourne 1, 2 et 3, et je souhaite avoir quelque chose du style :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <root>
      <id>1</id>
      <id>2</id>
      <id>3</id>
    </root>

    Initialement, j'avais fait cela :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE @Xml XML = '<root/>';
    DECLARE @Table TABLE(id INT);
    DECLARE @TableX TABLE(x XML);
     
    INSERT INTO @Table (id) VALUES (1), (2), (3);
    INSERT INTO @TableX (x) VALUES (@Xml);
     
    UPDATE @TableX SET x.modify('insert <id>{sql:column("id")}</id> into (/root)[1]')
    FROM @TableX, @Table;
     
    SELECT * FROM @TableX;

    Mais cela ne fonctionne bien entendu pas (sinon, je ne serais pas là à poser la question !). Cela ne m'insère qu'un seul élément
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <root>
      <id>1</id>
    </root>

    Pour contourner le problème, je vais utiliser une requête SQL avec un FOR XML PATH. Mais pour ma culture perso, est-il possible d'arriver à cela en n'utilisant que modify ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  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
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    J'ai pas trop le temps, mais quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE @TableX SET x.modify('insert sql:column("T.x") into (/root)[1]')
    FROM   @TableX
           CROSS APPLY (SELECT id FROM @Table FOR XML AUTO, ELEMENTS) AS T(x);
    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
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Merci, cela m'a mis sur la bonne piste ! Je n'avais pas songé à utiliser CROSS APPLY.

    La solution :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE @TableX SET x.modify('insert sql:column("T.x") into (/root)[1]')
    FROM @TableX
    CROSS APPLY (SELECT id AS 'text()' FROM @Table FOR XML PATH('id'), TYPE) AS T(x);
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

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

Discussions similaires

  1. [XSLT 1.0] Modifier la valeur d'un élément d'un fichier XML
    Par gavelin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 12/01/2011, 10h49
  2. Réponses: 9
    Dernier message: 29/05/2008, 13h33
  3. Réponses: 2
    Dernier message: 03/05/2008, 13h34
  4. Réponses: 2
    Dernier message: 01/06/2004, 12h47
  5. [Débutant][PS] modifier un insert en update
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 19/05/2004, 16h33

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