web-dev-qa-db-fra.com

Comment interroger une colonne XML dans SQL

J'ai une table, T1, avec une colonne XML, EventXML, sur SQL Server 2008. Je souhaite interroger toutes les lignes où certains nœuds contiennent une valeur particulière. Mieux, je voudrais récupérer la valeur dans un autre nœud. Le tableau T1:

T1:
   EventID, int
   EventTime, datetime
   EventXML, XML

Voici un exemple de hiérarchie XML:

<Event>
   <Indicator>
      <Name>GDP</Name>
   </Indicator>
   <Announcement>
      <Value>2.0</Value>
      <Date>2012-01-01</Date>
   </Announcement>
</Event>
  1. Comment trouver toutes les lignes liées à l'indicateur "PIB";
  2. Comment obtenir toutes les valeurs pour l'indicateur "PIB";
31
fivelements

Que dis-tu de ça?

SELECT 
    EventID, EventTime,
    AnnouncementValue = t1.EventXML.value('(/Event/Announcement/Value)[1]', 'decimal(10,2)'),
    AnnouncementDate = t1.EventXML.value('(/Event/Announcement/Date)[1]', 'date')
FROM
    dbo.T1
WHERE
    t1.EventXML.exist('/Event/Indicator/Name[text() = "GDP"]') = 1

Il trouvera toutes les lignes où le /Event/Indicator/Name est égal à GDP, puis il affichera le <Announcement>/<Value> et <Announcement>/<Date> pour ces lignes.

Voir démo SQLFiddle

62
marc_s
DECLARE @t XML = '
<Event>
   <Indicator>
      <Name>GDP</Name>
   </Indicator>
   <Announcement>
      <Value>2.0</Value>
      <Date>2012-01-01</Date>
   </Announcement>
</Event>
<Event>
   <Indicator>
      <Name>Other</Name>
   </Indicator>
   <Announcement>
      <Value>3.0</Value>
      <Date>2012-01-01</Date>
   </Announcement>
</Event>
'

SELECT  node.value('.', 'NUMERIC(20, 2)')
FROM    @t.nodes('/Event[Indicator/Name/node()=''GDP'']/Announcement/Value') t(node)
9
Quassnoi