Создать XML формат пути из таблицы SQL - PullRequest
0 голосов
/ 10 февраля 2020

Я пытался получить XML из таблицы SQL:

Мой стол

------------
-- Table1 --
------------

ID    Flight1    Flight2
--------------------------
1     F0123      F0789
2     F0345      F0678

Query:

Select
    A.[ID],
    A.[Flight1] as "FlightDescription/Number",
    A.[Flight2] as "FlightDescription/Number"
from
    [Table1] A
for xml path('Flight'), root('Flights')

Мой ожидаемый результат:

 <Flights>
  <Flight>
    <ID>1</ID>
    <FlightDescription>
        <Number>F0123</Number>
    </FlightDescription>
    <FlightDescription>
        <Number>F0789</Number>
    </FlightDescription>
  </Flight>
  <Flight>
    <ID>2</ID>
    <FlightDescription>
        <Number>F0345</Number>
    </FlightDescription>
    <FlightDescription>
        <Number>F0678</Number>
    </FlightDescription>
  </Flight>
</Flights>

Но вместо этого я получаю это:

<Flights>
  <Flight>
    <ID>1</ID>
    <FlightDescription>
        <Number>F0123F0789</Number>
    </FlightDescription>
  </Flight>
  <Flight>
    <ID>2</ID>
    <FlightDescription>
        <Number>F0345F0678</Number>
    </FlightDescription>
  </Flight>
</Flights>

Я могу это выяснить ... В моей таблице у меня есть более 4 номеров рейсов для каждого ID, поэтому я хотел бы знать, есть ли способ получить все из них так, как мне нужно.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Создать пустой узел между двумя элементами / узлами FlightDescription / Number.

declare @f table
(
Id int,
Flight1 varchar(20),
Flight2 varchar(20)
);

insert into @f(Id, Flight1, Flight2)
values
(1, 'F0123', 'F0789'),
(2, 'F0345', 'F0678');

Select
    A.[ID],
    A.[Flight1] as 'FlightDescription/Number',
    '',
    A.[Flight2] as 'FlightDescription/Number'
from
    @f A
for xml path('Flight'), root('Flights');
1 голос
/ 10 февраля 2020

Вот еще один немного более сложный способ. XQuery и его FLWOR выражение. Таким образом, вы формируете XML явно. Легко создавать, понимать, вносить любые изменения и поддерживать в будущем.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT PRIMARY KEY, Flight1 VARCHAR(20), Flight2 VARCHAR(20));

INSERT INTO @tbl (ID, Flight1, Flight2) VALUES
(1, 'F0123', 'F0789'),
(2, 'F0345', 'F0678');
-- DDL and sample data population, end

SELECT (
SELECT * 
FROM @tbl
FOR XML PATH('r'), TYPE, ROOT('root')).query('<Flights>
{
    for $x in /root/r
    return <Flight>
        {$x/ID}
        <FlightDescription>
            <number>{data($x/Flight1)}</number>
            <number>{data($x/Flight2)}</number>
        </FlightDescription>
    </Flight>
}
</Flights>'
);

Вывод

<Flights>
  <Flight>
    <ID>1</ID>
    <FlightDescription>
      <number>F0123</number>
      <number>F0789</number>
    </FlightDescription>
  </Flight>
  <Flight>
    <ID>2</ID>
    <FlightDescription>
      <number>F0345</number>
      <number>F0678</number>
    </FlightDescription>
  </Flight>
</Flights>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...