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

Как получить определенный атрибут из элемента 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 (если это правильный термин).

Любая помощь будет оценена.

4b9b3361

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