Выберите несколько строк в столбце базы данных xml, используя xpath (возможно без курсора?) - PullRequest
6 голосов
/ 01 февраля 2011

Скажем, у меня есть следующая таблица (где History - это столбец xml):

Id      Value     History
1       "Hello"   <History>
                    <Node date="1-1-2011">World</Node>
                    <Node date="1-2-2011">Foo</Node>
                    <Node date="1-3-2011">Bar</Node>
                  </History>
2       "Baz"     <History>
                    <Node date="1-1-2011">Buzz</Node>
                    <Node date="1-2-2011">Fizz</Node>
                    <Node date="1-3-2011">Beam</Node>
                  </History>

И из этого я хотел выбрать новую таблицу, например:

HistoryId   Id      Value       Date
1           1       "World"     1-1-2011
2           1       "Foo"       1-2-2011
3           1       "Bar"       1-3-2011
4           2       "Buzz"      1-1-2011
5           2       "Fizz"      1-2-2011
6           2       "Beam"      1-3-2011

Как быЯ делаю это?

Если бы это было просто автономное значение XML, я мог бы сделать что-то вроде этого:

DECLARE @xml2 XML = '
<History>
  <Node date="1-1-2011">World</Node>
  <Node date="1-2-2011">Foo</Node>
  <Node date="1-3-2011">Bar</Node>
</History>'

SELECT 
    x.value('(@date)[1]','date') AS [Date]
    ,x.value('.', 'nvarchar(50)') AS Value
FROM @xml2.nodes('/History/Node') temp(x) 

Но я не уверен, как это сделать, когда данные XML являются частьюстолбца таблицы.Я мог бы, вероятно, найти способ сделать это с помощью cursor, но мне было интересно, есть ли более элегантное декларативное решение, о котором я не знаю.

1 Ответ

9 голосов
/ 01 февраля 2011

Используйте крестик

declare @T table (Id int, Value nvarchar(50), History xml)
insert into @T values (1, 'Hello','
<History>
  <Node date="1-1-2011">World</Node>
  <Node date="1-2-2011">Foo</Node>
  <Node date="1-3-2011">Bar</Node>
</History>')
insert into @T values (2, 'Baz','
<History>
  <Node date="1-1-2011">Buzz</Node>
  <Node date="1-2-2011">Fizz</Node>
  <Node date="1-3-2011">Beam</Node>
</History>')

select
    Id,
    h.n.value('.', 'varchar(10)') as Value,
    h.n.value('@date', 'varchar(10)') as Date
from @T
    cross apply history.nodes('History/Node') h(n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...