Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить данные из XML поменяв строки и столбцы / 4 сообщений из 4, страница 1 из 1
05.10.2018, 18:00
    #39713774
Big17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из XML поменяв строки и столбцы
Не знаю, как правильно сформулировать тему, но суть в следующем.
В XML-документе, содержащем "табличные" данные внешние теги - это как правило строки, а внутренние - столбцы.
А в моем случае нужно распарсить вывернутый XML-файл (см. ниже).
И никак не могу скрутить xquery выражение, чтобы добиться этого.

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
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)
...
Рейтинг: 0 / 0
05.10.2018, 18:01
    #39713776
Big17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из XML поменяв строки и столбцы
...
Рейтинг: 0 / 0
05.10.2018, 18:36
    #39713786
AlanDenton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из XML поменяв строки и столбцы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
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
...
Рейтинг: 0 / 0
05.10.2018, 23:27
    #39713828
Big17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить данные из XML поменяв строки и столбцы
Спасибо! То что нужно!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить данные из XML поменяв строки и столбцы / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]