Comment interroger une colonne xml dans tsql

J'ai une table, T1, avec une colonne XML, EventXML, sur SQL Server 2008. Je veux interroger toutes les lignes où certains nœuds contiennent une valeur particulière. Mieux, je voudrais récupérer la valeur dans un nœud différent. 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 de L'indicateur "PIB";
31
demandé sur marc_s 2012-11-02 17:13:24

2 réponses

Et ç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 va trouver toutes les lignes où le /Event/Indicator/Name est égal à GDP, puis il affiche le <Announcement>/<Value> et <Announcement>/<Date> pour ces lignes.

Voir démonstration SQLFiddle

62
répondu marc_s 2012-11-02 13:21:21
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
répondu Quassnoi 2012-11-02 13:22:45