XML-данные в таблицу SQL Server - PullRequest
       1

XML-данные в таблицу SQL Server

0 голосов
/ 17 сентября 2018

Я посмотрел онлайн для преобразования данных 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

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

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

Следующий ответ дополнительно сообщит вам, с какого узла <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
0 голосов
/ 18 сентября 2018

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

В любом случае - попробуйте это SELECT утверждение:

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

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

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