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>
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
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)