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 :

Requête sur un champ XML


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut Requête sur un champ XML
    Bonjour,

    J'ai une table qui comporte un champ XML dans lequel j'écris des choses du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <Infos IdUtilisateur="203">
      <CommentEtat>Refus pour cause de <b><u><font color="#ff0000">non conformité</font></u></b></CommentEtat>
    </Infos>
    Avec un peu de HTML dedans donc...

    Si je fais la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select Monchamp.value('/Infos[1]', 'nvarchar(max)') from Matable where Ident=999
    je m'attends à récupérer tout ce qui se trouve dans la balise <CommentEtat>, hors, je ne récupère QUE le texte, tout le HTML a disparu alors qu'il est bien dans le champ XML !!

    Quelqu'un sait pourquoi et surtout s'il y a une solution à mon problème ?

    Merci d'avance...

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Votre HTML n'étant pas encodé, il est analysé comme étant de l'XML...


    vous pouvez faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT LaColonneXml.query('/Infos[1]/CommentEtat[1]') FROM Matable
    vous aurez juste la balise <CommentEtat> dans le resultat...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Votre HTML n'étant pas encodé, il est analysé comme étant de l'XML...


    vous pouvez faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT LaColonneXml.query('/Infos[1]/CommentEtat[1]') FROM Matable
    vous aurez juste la balise <CommentEtat> dans le resultat...
    En effet, c'est beaucoup mieux, mais je vais être pénible : Est-ce possible d'obtenir ce qui ce trouve DANS la balise ?

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Le mieux serait de regler le problème en amont, en encodant votre HTML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ;WITH MaTable AS(
    	select 
    	CAST('<Infos IdUtilisateur="203">
      <CommentEtat>Refus pour cause de &lt;b&gt;&lt;u&gt;&lt;font color=&quot;#ff0000&quot;&gt;non conformité&lt;/font&gt;&lt;/u&gt;&lt;/b&gt;</CommentEtat>
    </Infos>' AS XML) AS LaColonneXml
    )
    SELECT LaColonneXml.value('/Infos[1]', 'varchar(100)') FROM Matable
    ou en mettant une section CDATA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ;with MaTable as (
    	select 
    	CAST('<Infos IdUtilisateur="203">
      <CommentEtat><![CDATA[Refus pour cause de <b><u><font color="#ff0000">non conformité</font></u></b>]]></CommentEtat>
    </Infos>' AS XML) AS LaColonneXml
    )
    SELECT LaColonneXml.value('/Infos[1]', 'varchar(100)') FROM Matable
    au pire sinon, vous pouvez faire deux REPLACE pour supprimer vos balises (ouvrante et fermante) CommentEtat, mais je trouve ça moins propre :

    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
     
     
    ;WITH MaTable AS (
    	SELECT 
    	CAST('<Infos IdUtilisateur="203">
      <CommentEtat>Refus pour cause de <b><u><font color="#ff0000">non conformité</font></u></b></CommentEtat>
    </Infos>' AS XML) AS LaColonneXml
    )
    SELECT REPLACE(
    		REPLACE(
    			CAST(
    				LaColonneXml.query('/Infos[1]/CommentEtat[1]') 
    				AS VARCHAR(1000)
    			)
    			, '<CommentEtat>'
    			, ''
    		)
    		, '</CommentEtat>'
    		, ''
    	) 
    FROM Matable

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    ou en mettant une section CDATA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ;with MaTable as (
    	select 
    	CAST('<Infos IdUtilisateur="203">
      <CommentEtat><![CDATA[Refus pour cause de <b><u><font color="#ff0000">non conformité</font></u></b>]]></CommentEtat>
    </Infos>' AS XML) AS LaColonneXml
    )
    SELECT LaColonneXml.value('/Infos[1]', 'varchar(100)') FROM Matable
    [/code]
    Le CDATA me plaît beaucoup plus, j'aurais dû y penser !!
    Merci en tout cas.

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

Discussions similaires

  1. requête sur un champ au format xml
    Par DiverSIG dans le forum Requêtes
    Réponses: 2
    Dernier message: 19/11/2009, 13h52
  2. [SQL Serveur 2005] Requête sur un champ de type XML
    Par Cyrilange dans le forum Développement
    Réponses: 3
    Dernier message: 23/06/2008, 07h15
  3. requête sur le champ date
    Par bouba_95 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 10/01/2007, 15h10
  4. Réponses: 3
    Dernier message: 18/05/2006, 23h55
  5. requêtes sur des champs date
    Par wiwi dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 03/02/2006, 14h14

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