Как запросить столбец xml в tsql
У меня есть таблица T1 с столбцом XML, EventXML, на SQL Server 2008. Я хочу запросить все строки, где определенное node содержит определенное значение. Лучше, я хотел бы получить значение в другом node. Таблица T1:
T1:
EventID, int
EventTime, datetime
EventXML, XML
Вот пример иерархии XML:
<Event>
<Indicator>
<Name>GDP</Name>
</Indicator>
<Announcement>
<Value>2.0</Value>
<Date>2012-01-01</Date>
</Announcement>
</Event>
- Как найти все строки, связанные с индикатором "ВВП";
- Как получить все значения для индикатора "ВВП";
Ответы
Ответ 1
Как насчет этого?
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
Он найдет все строки, где /Event/Indicator/Name
равно GDP
, а затем отобразит <Announcement>/<Value>
и <Announcement>/<Date>
для этих строк.
См. демоверсия SQLFiddle
Ответ 2
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)