У меня есть xml данных с коллекциями, вложенными в несколько уровней.
DECLARE @xml AS XML
SET @xml = '<periods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<period>
<id>1</id>
<valid_from>2020-07-31</valid_from>
<valid_to xsi:nil="true" />
<elements>
<element>
<from>1</from>
<to>2</to>
</element>
<element>
<from>1</from>
<to>3</to>
</element>
</elements>
</period>
<period>
<id>3</id>
<valid_from>2020-05-01</valid_from>
<valid_to>2020-06-01</valid_to>
<elements>
<element>
<from>7</from>
<to>9</to>
</element>
<element>
<from>10</from>
<to>11</to>
</element>
</elements>
</period>
</periods>'
Я бы хотел выделить все эти данные в форму:
id valid_from valid_to from to
1 2020-07-31 00:00:00.000 NULL 1 2
1 2020-07-31 00:00:00.000 NULL 1 3
3 2020-05-01 00:00:00.000 2020-06-01 00:00:00.000 7 9
3 2020-05-01 00:00:00.000 2020-06-01 00:00:00.000 10 11
Ближайший Мне удалось получить это с помощью этого запроса
SELECT 'id' = v.value('id[1]', 'int'),
'dte_from' = v.value('valid_from[1]', 'datetime'),
'dte_to' = v.value('valid_to[1][not(@xsi:nil = "true")]', 'datetime'),
'from' = y.value('from[1][not(@xsi:nil = "true")]', 'int'), 'to' = y.value('to[1]', 'int')
FROM @xml.nodes('/periods/period') x(v)
CROSS APPLY x.v.nodes('/periods/period/elements/element') z(y)
, но он просто возвращает
id dte_from dte_to from to
1 2020-07-31 00:00:00.000 NULL 1 2
1 2020-07-31 00:00:00.000 NULL 1 3
1 2020-07-31 00:00:00.000 NULL 7 9
1 2020-07-31 00:00:00.000 NULL 10 11
3 2020-05-01 00:00:00.000 2020-06-01 00:00:00.000 1 2
3 2020-05-01 00:00:00.000 2020-06-01 00:00:00.000 1 3
3 2020-05-01 00:00:00.000 2020-06-01 00:00:00.000 7 9
3 2020-05-01 00:00:00.000 2020-06-01 00:00:00.000 10 11
Спасибо за ваше время.