Подтвердить что ты не робот

Как запросить столбец 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>
  • Как найти все строки, связанные с индикатором "ВВП";
  • Как получить все значения для индикатора "ВВП";
4b9b3361

Ответ 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)