Я искал в Интернете преобразование данных XML в таблицу с помощью T-SQL. Я вижу только часть ответа. Мой XML немного отличается. Может ли кто-нибудь помочь мне в следующем.

DECLARE @XmlData XML

SELECT @XmlData = '<header>
  <data>
    <numbersData>
      <numbers>
        <number>1</number>
        <number>2</number>
      </numbers>
    </numbersData>
  </data>
  <data>
    <numbersData>
      <numbers>
        <number>3</number>
        <number>4</number>
      </numbers>
    </numbersData>
  </data>
</header>'

Запрос :

SELECT 
    Numbers.Data.value('(number)[1]', 'VARCHAR(100)') AS Num
FROM
    @XmlData.nodes('/header/data/numbersData/numbers') Numbers(Data)

Результат этого:

Num
----
1
3

Обратите внимание, как он возвращает только 1 и 3. 2 и 4 отсутствуют.

К сожалению, этот файл исходит от клиента, и он не изменит формат. Я пытаюсь получить следующий результат

Num
---
1
2
3
4
3
gsva 17 Сен 2018 в 23:48

2 ответа

Лучший ответ

Почему вы конвертируете те значения, которые явно являются числами, в VARCHAR(100)? Нет никакого смысла ....

В любом случае - попробуйте этот оператор SELECT:

SELECT 
    Data.value('.', 'INT') AS Num
FROM
    @XmlData.nodes('/header/data/numbersData/numbers/number') Numbers(Data)

XPath в основном "детализирует" все элементы XML <number> и, таким образом, получает полный список всех этих элементов и преобразует их значение в INT - это выводит нужные четыре числа.

2
marc_s 18 Сен 2018 в 04:25

Если вам действительно не нужно ничего, кроме цифр, у вас уже есть ответы.

Следующий ответ дополнительно сообщит вам, из какого узла <data> был взят номер:

WITH theData AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS DataIndex
          ,d.query('.') DataNode
    FROM @XmlData.nodes('/header/data') A(d)
)
SELECT d.DataIndex
      ,n.value('text()[1]','int') AS TheNumber
FROM theData d
CROSS APPLY d.DataNode.nodes('data/numbersData/numbers/number') A(n);

Результат

DataIndex   TheNumber
1           1
1           2
2           3
2           4
2
Shnugo 18 Сен 2018 в 06:18