raw - xml.value sql server
Cómo consultar la columna xml en tsql (2)
Tengo una tabla, T1, con una columna XML, EventXML, en SQL Server 2008. Quiero consultar todas las filas donde cierto nodo contiene un valor particular. Mejor, me gustaría recuperar el valor en un nodo diferente. La tabla T1:
T1:
EventID, int
EventTime, datetime
EventXML, XML
Aquí hay una jerarquía XML de ejemplo:
<Event>
<Indicator>
<Name>GDP</Name>
</Indicator>
<Announcement>
<Value>2.0</Value>
<Date>2012-01-01</Date>
</Announcement>
</Event>
- Cómo encontrar todas las filas relacionadas con el indicador "PIB";
- Cómo obtener todos los valores para el indicador "PIB";
¿Qué tal esto?
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
Encontrará todas las filas donde /Event/Indicator/Name
es igual a GDP
y luego mostrará <Announcement>/<Value>
y <Announcement>/<Date>
para esas filas.
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)