SQL Сервер объединяет элементы в XML, но должен быть отдельными элементами - PullRequest
2 голосов
/ 17 марта 2020

У меня следующий запрос:

SELECT TOP 1 'St. Kulakow 12' AS 'address',
             'P123' AS 'address'
FROM tab
FOR XML PATH ('ROOT')

Он возвращает мне объединенный тег 'адрес', но он должен быть отдельным.

Я получаю:

<ROOT>
  <address>St. Kulakow 12P123</address>
</ROOT>

но должно быть:

<ROOT>
 <address>St. Kulakow 12</address>
 <address>P123</address>
</ROOT>

Есть ли какой-нибудь вариант, чтобы получить его отдельно?

Ответы [ 3 ]

2 голосов
/ 17 марта 2020

TT. Вы были правы :) Но в приведенном ниже случае это не будет работать вообще:

SELECT 'Warsaw' AS 'ADR/City',
       'WKPL' AS 'ADR/State',
       'St. Kulakow 12' AS 'ADR/address',
        NULL,
       'P123' AS 'ADR/address',
       '12345' AS 'ADR/Zip'
FOR XML PATH ('ROOT')

Вы получите:

<ROOT>
  <ADR>
    <City>Warsaw</City>
    <State>WKPL</State>
    <address>St. Kulakow 12</address>
  </ADR>
  <ADR>
    <address>P123</address>
    <Zip>12345</Zip>
  </ADR>
</ROOT>

Поэтому нам нужно добавить псевдоним в ваше решение:

SELECT 'Warsaw' AS 'ADR/City',
       'WKPL' AS 'ADR/State',
       'St. Kulakow 12' AS 'ADR/address',
        NULL AS 'ADR',
       'P123' AS 'ADR/address',
       '12345' AS 'ADR/Zip'
FOR XML PATH ('ROOT')

И тогда мы получим:

<ROOT>
  <ADR>
    <City>Warsaw</City>
    <State>WKPL</State>
    <address>St. Kulakow 12</address>
    <address>P123</address>
    <Zip>12345</Zip>
  </ADR>
</ROOT>

Спасибо за помощь:)

2 голосов
/ 17 марта 2020

Это будет делать:

SELECT TOP 1 'St. Kulakow 12' AS 'address',
             NULL,
             'P123' AS 'address'
--FROM tab
FOR XML PATH ('ROOT')

или

SELECT TOP 1 'St. Kulakow 12' AS 'address',
             '',
             'P123' AS 'address'
--FROM tab
FOR XML PATH ('ROOT')

«Пустой элемент» служит своего рода прерывателем для элементов.

0 голосов
/ 18 марта 2020

Попробуйте это

Имя таблицы: DemoAddress

Id | Address
------------
1  | aaaa
2  | bbbb
3  | cccc  

Запрос будет выглядеть следующим образом

select 'address'=Address from DemoAddress FOR XML PATH (''),type,root('root')

И тогда мы получим

<root>
  <address> aaaa</address>
  <address> bbbb</address>
  <address> cccc</address>
</root>
...