Мой предыдущий вопрос был решен много">здесь. Теперь я добавляю к нему еще один уровень сложности — данные, которые являются вложенными родителем, дочерним элементом, внуком.
You can see and run sample here: https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=df2766c95383d4c8c2d1f55539634341< /а>
Пример кода, где Leg1 может быть поездкой туда, а Leg2 может быть поездкой назад. Каждая нога может иметь один или несколько полетов.
DECLARE @xml XML='
<Reservation>
<Name>Neal</Name>
<Leg seq=''1''>
<Flight>12</Flight>
</Leg>
<Leg seq=''2''>
<Flight>34</Flight>
<Flight>56</Flight>
</Leg>
</Reservation>'
select @xml
DECLARE @xmlTable TABLE (
xmlDoc Xml
);
Insert into @xmltable values (@xml)
--Select xmlDoc from @XmlTable
Select xmlDoc.value('(//Name)[1]', 'varchar(30)') as Passenger,
XmlData2.xmlDoc2.query('.') as XmlData2,
XmlData2.xmlDoc2.value('./@seq', 'int') as LegSeq,
XmlData3.xmlDoc3.query('.') as XmlData3,
XmlData3.xmlDoc3.value('.', 'varchar(20)') as Flight
FROM @xmlTable as t
CROSS APPLY
t.xmlDoc.nodes('//Leg') AS XmlData2(xmlDoc2)
CROSS APPLY
t.xmlDoc.nodes('//Flight') AS XmlData3(xmlDoc3)
Проблема в том, что мне все еще нужно вернуть 3 строки, но теперь я получаю 6.
Ожидаемый результат:
Neal LegSeq=1 Flight=12
Neal LegSeq=2 Flight=34
Neal LegSeq=2 Flight=56
Microsoft SQL Server 2019 (окончательная первоначальная версия) — 15.0.2000.5 (X64) 24 сентября 2019 г. 13:48:23 Copyright (C) Microsoft Corporation Developer Edition 2019 (64-разрядная версия) в Windows Server 2019 Standard 10.0 (сборка 17763:)