Как получить определенный атрибут из элемента XML в SQL Server - PullRequest
32 голосов
/ 13 октября 2009

У меня есть что-то вроде следующего XML в столбце таблицы:

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

Я пытаюсь получить часть valueB из XML через TSQL

Пока я получаю правильный узел, но теперь я не могу понять, как получить атрибут.

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

Я полагаю, я мог бы просто добавить значение / @ в конец, но тогда SQL говорит мне, что атрибуты должны быть частью узла. Я могу найти много примеров для выбора атрибутов дочерних узлов, но ничего об атрибутах родного брата (если это правильный термин).

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

Ответы [ 2 ]

56 голосов
/ 13 октября 2009

Попробуйте использовать функцию .value вместо .query:

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

Выражение XPath может потенциально возвращать список узлов, поэтому вам нужно добавить [1] в этот потенциальный список, чтобы указать SQL Server использовать первую из этих записей (и да - этот список основан на 1 - не 0 на основе). В качестве второго параметра вам нужно указать, к какому типу следует преобразовать значение - просто угадав здесь.

Марк

6 голосов
/ 14 октября 2009

В зависимости от фактической структуры вашего 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'
...