Вставить в с полем XML, чтобы получить все значения дочернего элемента? - PullRequest
1 голос
/ 01 ноября 2011

У меня есть таблица с полем XML.Схема поля XML похожа на эту ...

<Root>
  <Parent>
    <Child>
      <SomeValue>1</SomeValue>
    </Child>
    <Child>
      <SomeValue>1</SomeValue>
    </Child>
  </Parent>

Я знаю, как получить первое, второе и N-е значения SomeValue, используя это ...

SELECT      
Child.value('(SomeValue)[1]', 'int')
FROM XMLField.nodes("/Root/Parent/Child[1]") AS N(Child) 

Япытаясь использовать оператор Insert Into, чтобы получить все значения узлов SomeValue в таблицу.Проблема в том, что может быть несколько дочерних элементов на одного родителя, и я знаю, как получить по одному.Есть ли простой способ сделать это без зацикливания логики?(Каждое значение SomeValue должно быть собственной записью в таблице, в которую я вставляю).

Дополнительные кредиты: В приведенном мной примере показано получение первого значения SomeValue из первого дочернего элемента одного поля XML.Ваш ответ был бы очень полезен, если бы вы могли найти решение, которое бы не только собирало все значения SomeValue из поля одной записи, но вместо этого все значения SomeValue из этого поля в каждой записи таблицы.

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Это даст вам первое SomeValue во всем дочернем узле:

SELECT      
N.rows.value('SomeValue[1]', 'int')
FROM XMLField.nodes("/Root/Parent/Child") AS N(rows) 

Но не уверен, как это сделать, если у вас есть 2 SomeValue в том же дочернем узле

0 голосов
/ 02 ноября 2011
declare @T table (XMlField xml)

insert into @T values
('<Root>
  <Parent>
    <Child>
      <SomeValue>1</SomeValue>
    </Child>
    <Child>
      <SomeValue>2</SomeValue>
    </Child>
  </Parent>
</Root>')

insert into @T values
('<Root>
  <Parent>
    <Child>
      <SomeValue>3</SomeValue>
    </Child>
    <Child>
      <SomeValue>4</SomeValue>
    </Child>
  </Parent>
</Root>')

select X.N.value('SomeValue[1]', 'int') as SomeValue
from @T as T
  cross apply T.XMLField.nodes('/Root/Parent/Child') as X(N)

Результат:

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