powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить данные из XML поменяв строки и столбцы
4 сообщений из 4, страница 1 из 1
Получить данные из XML поменяв строки и столбцы
    #39713774
Фотография Big17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, как правильно сформулировать тему, но суть в следующем.
В 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
Получить данные из XML поменяв строки и столбцы
    #39713776
Фотография Big17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Получить данные из XML поменяв строки и столбцы
    #39713786
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Получить данные из XML поменяв строки и столбцы
    #39713828
Фотография Big17
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! То что нужно!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить данные из XML поменяв строки и столбцы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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