transact raw nodos node leer for exist desde crear attribute xml sql-server-2008 tsql xquery

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>

  1. Cómo encontrar todas las filas relacionadas con el indicador "PIB";
  2. 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.

Ver demostración de 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)