Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Получить данные из XML поменяв строки и столбцы  [new]
Big17
Member

Откуда:
Сообщений: 672
Не знаю, как правильно сформулировать тему, но суть в следующем.
В XML-документе, содержащем "табличные" данные внешние теги - это как правило строки, а внутренние - столбцы.
А в моем случае нужно распарсить вывернутый XML-файл (см. ниже).
И никак не могу скрутить xquery выражение, чтобы добиться этого.

В конечном итоге полученные данные нужно положить в обычную табличку.

Привожу неправильный пример:

DECLARE @XmlTable TABLE ([XmlDoc] xml)

DECLARE @XmlDoc xml
SET @XmlDoc =
'<SpreadSheet>
  <column>
    <row>Столбец 1. Строка 1</row>
    <row>Столбец 1. Строка 2</row>
    <row>Столбец 1. Строка 3</row>
    <row>Столбец 1. Строка 4</row>
  </column>
  <column>
    <row>Столбец 2. Строка 1</row>
    <row>Столбец 2. Строка 2</row>
    <row>Столбец 2. Строка 3</row>
    <row>Столбец 2. Строка 4</row>
  </column>
  <column>
    <row>Столбец 3. Строка 1</row>
    <row>Столбец 3. Строка 2</row>
    <row>Столбец 3. Строка 3</row>
    <row>Столбец 3. Строка 4</row>
  </column>
</SpreadSheet>'

INSERT INTO @XmlTable VALUES (@XmlDoc)


SELECT C.value('row[1]', 'nvarchar(50)')
	  ,C.value('row[2]', 'nvarchar(50)')
	  ,C.value('row[3]', 'nvarchar(50)')
	  ,C.value('row[4]', 'nvarchar(50)')
  FROM @XmlTable
 CROSS APPLY XmlDoc.nodes('/SpreadSheet/column') as T(C)


 --SELECT C.value('(.)[1]', 'nvarchar(50)')
--  FROM @XmlTable
-- CROSS APPLY XmlDoc.nodes('/SpreadSheet/column[1]/row') as T(C)
5 окт 18, 18:00    [21696680]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML поменяв строки и столбцы  [new]
Big17
Member

Откуда:
Сообщений: 672


К сообщению приложен файл. Размер - 43Kb
5 окт 18, 18:01    [21696683]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML поменяв строки и столбцы  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @x XML =
N'<SpreadSheet>
  <column>
    <row>Столбец 1. Строка 1</row>
    <row>Столбец 1. Строка 2</row>
    <row>Столбец 1. Строка 3</row>
    <row>Столбец 1. Строка 4</row>
  </column>
  <column>
    <row>Столбец 2. Строка 1</row>
    <row>Столбец 2. Строка 2</row>
    <row>Столбец 2. Строка 3</row>
    <row>Столбец 2. Строка 4</row>
  </column>
  <column>
    <row>Столбец 3. Строка 1</row>
    <row>Столбец 3. Строка 2</row>
    <row>Столбец 3. Строка 3</row>
    <row>Столбец 3. Строка 4</row>
  </column>
</SpreadSheet>'

SELECT MAX(CASE WHEN t.rn = 1 THEN t.val END)
     , MAX(CASE WHEN t.rn = 2 THEN t.val END)
     , MAX(CASE WHEN t.rn = 3 THEN t.val END)
FROM (
    SELECT val = t2.c2.value('(./text())[1]', 'NVARCHAR(20)')
         , rn
         , rn2 = ROW_NUMBER() OVER (PARTITION BY rn ORDER BY 1/0)
    FROM (
        SELECT col = t.c.query('.')
             , rn = ROW_NUMBER() OVER (ORDER BY 1/0)
        FROM @x.nodes ('/SpreadSheet/column') t(c)
    ) t
    CROSS APPLY t.col.nodes('column/row') t2(c2)
) t
GROUP BY rn2
ORDER BY rn2
5 окт 18, 18:36    [21696706]     Ответить | Цитировать Сообщить модератору
 Re: Получить данные из XML поменяв строки и столбцы  [new]
Big17
Member

Откуда:
Сообщений: 672
Спасибо! То что нужно!
5 окт 18, 23:27    [21696856]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить