CREATE TABLE SportsEvent
(ID INT, Name NVARCHAR(20), Results XML);
GO
DECLARE @Results XML=
'<Athletics>
<Event ID="001" Name="100m">
<Gold>John Doe</Gold>
<Silver>Harry Smith</Silver>
<Bronze>Kenneth Brown</Bronze>
</Event>
<Event ID="002" Name="High Jump">
<Gold>Sarah Jones</Gold>
<Silver>Janice Johnson</Silver>
<Bronze>Alicia Armstrong</Bronze>
</Event>
</Athletics>'
INSERT INTO SportsEvent
VALUES(1, 'AthleticsDay', @Results);
SELECT * FROM SportsEvent;
If I want to pull out an element based on the event ID, no problem:
SELECT Results.query('(/Athletics/Event[@ID="001"]/Gold)')
FROM SportsEvent
WHERE ID = 1
I can do the same with a relative reference:
SELECT Results.query('(Athletics/Event)[1]')
FROM SportsEvent
WHERE ID = 1
But what if I want to pull the event Name based on either a relative or absolute ?:
SELECT Results.query('(Athletics/Event[@Name])[@ID="001"]')
FROM SportsEvent
WHERE ID = 1
SELECT Results.query('(Athletics/Event[@Name])[1]')
FROM SportsEvent
WHERE ID = 1
...both bring back ALL the data for that event.
I tried using the value method:
SELECT Results.value('(/Athletics/Event/@Name)[1]','VARCHAR(20)')
FROM SportsEvent
WHERE ID = 1
...but this only works for a relative reference i.e in this case the first set of results in the XML.
What if I want to specify an event ID and return just the event name (either as an XML fragment or as data/value)?