type read nodos node leer from data attribute sql-server xml xpath xquery

sql-server - read - xml.value sql server



Cómo obtener un atributo particular del elemento XML en SQL Server (3)

Tengo algo así como el siguiente XML en una columna de una tabla:

<?xml version="1.0" encoding="utf-8"?> <container> <param name="paramA" value="valueA" /> <param name="paramB" value="valueB" /> ... </container>

Estoy tratando de sacar la parte valueB del XML a través de TSQL

Hasta ahora estoy obteniendo el nodo correcto, pero ahora no puedo entender cómo obtener el atributo.

select xmlCol.query(''/container/param[@name="paramB"]'') from LogTable

Me imagino que podría simplemente agregar / @ valor al final, pero luego SQL me dice que los atributos tienen que ser parte de un nodo. Puedo encontrar muchos ejemplos para seleccionar los atributos de los nodos secundarios, pero no los atributos de los hermanos (si ese es el término correcto).

Cualquier ayuda sería apreciada.


Dependiendo de la estructura real de su xml, puede ser útil poner una vista sobre él para que sea más fácil de consumir utilizando sql ''regular'', por ejemplo

CREATE VIEW vwLogTable AS SELECT c.p.value(''@name'', ''varchar(10)'') name, c.p.value(''@value'', ''varchar(10)'') value FROM LogTable CROSS APPLY x.nodes(''/container/param'') c(p) GO -- now you can get all values for paramB as... SELECT value FROM vwLogTable WHERE name = ''paramB''


Intenta usar la función .value lugar de .query :

SELECT xmlCol.value(''(/container/param[@name="paramB"]/@value)[1]'', ''varchar(50)'') FROM LogTable

La expresión XPath podría devolver una lista de nodos, por lo tanto, debe agregar un [1] a esa lista potencial para decirle a SQL Server que use la primera de esas entradas (y sí, esa lista está basada en 1, no en 0 ) Como segundo parámetro, debe especificar a qué tipo debe convertirse el valor, simplemente adivine aquí.

Bagazo


$doc/param[@value = "valueB"]/fn:data(@value)
Suponiendo $ doc tiene el Xml.