Уничтожение XML с использованием метода node () - PullRequest
0 голосов
/ 26 апреля 2018

У меня проблемы с измельчением этого xml на сервере sql из-за разных уровней узлов в xml. Как я могу добиться этого в одном запросе.

У меня есть XML IN в следующем формате:

<abc>
<item>
<Customer id="12345" age="26">
<NAME>Alex</NAME>
</customer>
</item>
</abc>

Я пробовал следующий запрос, который дает мне идентификатор клиента, но я также хочу столбец имени помимо этого.

SELECT doc.col.value('@id','INT')
FROM @xml.nodes('/abc/item/customer') doc(col) 

Токовый выход:

CustomerID
----------
12345

Желаемый вывод:

CustomerID   Name
----------   -------
  12345      Alex

1 Ответ

0 голосов
/ 26 апреля 2018

Попробуй вот так

DECLARE @xml XML=
N'<abc>
<item>
<customer id="12345" age="26">
<NAME>Alex</NAME>
</customer>
</item>
</abc>';

SELECT doc.col.value('@id','INT') AS ID
      ,doc.col.value('(NAME/text())[1]','nvarchar(max)') AS Name
FROM @xml.nodes('/abc/item/customer') doc(col);

Некоторые объяснения:

  • XML строго чувствителен к регистру. Вы смешали Customer и customer ...

  • Очень помогает взглянуть на XML с правильным отступом:

Вы можете видеть, что <NAME> ниже <customer>

<abc>
  <item>
    <customer id="12345" age="26">
      <NAME>Alex</NAME>
    </customer>
  </item>
</abc>

Когда ваш .nodes() опустится до <customer>, это ваш текущий узел . Атрибут @id сидит прямо там. text() в <NAME> следует продолжить оттуда ...

...