Как получить определенный атрибут из элемента XML в SQL Server
У меня есть что-то вроде следующего XML в столбце таблицы:
<?xml version="1.0" encoding="utf-8"?>
<container>
<param name="paramA" value="valueA" />
<param name="paramB" value="valueB" />
...
</container>
Я пытаюсь получить часть valueB из XML через TSQL
До сих пор я получаю правильный node, но теперь я не могу понять, как получить атрибут.
select xmlCol.query('/container/param[@name="paramB"]') from LogTable
Я полагаю, что могу просто добавить/@значение до конца, но тогда SQL говорит мне, что атрибуты должны быть частью node. Я могу найти множество примеров для выбора атрибутов дочерних узлов, но ничего из атрибутов sibling (если это правильный термин).
Любая помощь будет оценена.
Ответы
Ответ 1
Попробуйте использовать функцию .value
вместо .query
:
SELECT
xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)')
FROM
LogTable
Выражение XPath потенциально может вернуть список узлов, поэтому вам нужно добавить [1]
в этот потенциальный список, чтобы сказать SQL Server использовать первую из этих записей (и да - этот список основан на 1, а не 0 на основе). В качестве второго параметра вам нужно указать, к какому типу нужно преобразовать значение - просто гадать здесь.
Марк
Ответ 2
В зависимости от фактической структуры вашего xml, может быть полезно поместить в нее представление, чтобы упростить его использование с помощью "обычного" sql, например
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'
Ответ 3
$doc/param[@value = "valueB"]/fn:data(@value)
Предполагая, что $doc имеет Xml.