Извлечение данных из XML в столбце Sql Server - PullRequest
3 голосов
/ 27 января 2010

Я только что обнаружил (по необходимости), что TSQL обладает некоторыми функциями для извлечения данных из столбцов, содержащих XML. У меня есть столбец Sql Server, который содержит данные XML (хотя тип столбца не xml ... это varchar). Я должен извлечь подмножество данных из столбца. Упрощенная запись будет выглядеть примерно так:

declare @Table as table(id char(1), datacolumn xml)

insert into @table
select 'a', '<root><vnode v="5" /><vnode v="8" /></root>'

insert into @table
select 'b', '<root><vnode v="7" /></root>'


id   datacolumn
---  -----------------------------------------
a    <root><vnode v="5" /><node v="8" /></root>
b    <root><vnode v="7" /></root>

Итак, я хотел бы предложить запрос, который бы возвращал что-то вроде:

id   data
---  ----
a    5
a    8
b    7

Я дошел до того, что смог получить некоторую информацию ... но мне не хватает некоторых концепций.

select id, T.c.value('node[1]', 'varchar(100)') mdata
from @table
cross apply datacolumn.nodes('/root') AS T(c)

Проблемы:

  1. Это даст мне значение внутри vnode (которое пусто), но мне нужно значение для атрибута, помеченного как "v".
  2. Кроме того, потому что у меня есть [1] там, я получаю первый узел ... но я хочу все из них ... но еще не нашел концепцию для этого.

1 Ответ

7 голосов
/ 27 января 2010
SELECT  id, T.c.value('@v', 'NVARCHAR(MAX)')
FROM    @table
CROSS APPLY
        datacolumn.nodes('/root/vnode') AS T(c)

datacolumn.nodes('/root/vnode') возвращает все экземпляры /root/vnode для каждого XML.

Есть 2 из них в a и 1 в b.

value() возвращает значение выражения XPath относительно узла, возвращенного предыдущим шагом.

Поскольку вы хотите вернуть значение атрибута рассматриваемого узла, вам просто нужно добавить к имени атрибута @ (что говорит о том, что вы хотите дочерний атрибут, а не дочерний узел).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...