Рассмотрим следующий xml:
<Persons num="3">
<Person age="5" />
<Person age="19" />
</Persons>
Необходимо извлечь этот XML-файл в реляционную таблицу:
Persons table (Age1 int, Age2 int, Age3 int , Age4 int)
Анализ должен удовлетворять следующим ограничениям:
- все лица с возрастом> = 18 должны быть назначены столбцам с наименьшим номером столбца, а значение должно быть 18
- если возраст человека не указан, он равен 18
- все лица в возрасте до 18 лет должны следовать
- если количество человек меньше 4, возраст не должен быть равен -1 -1016 *
В данном примере есть 3 человека, предоставляется возраст 2 из них: 5 и 19 соответственно. Содержание таблицы Персоны должно быть следующим:
18 18 5 -1
Есть ли лучший способ сделать это с xpath?
До сих пор я могу анализировать xml и назначать возрасты, но не ясно, как сделать заказ:
declare @XmlData xml =
'<Persons num="3">
<Person age="5" />
<Person age="19" />
</Persons>'
declare @Persons table (Age1 int, Age2 int, Age3 int , Age4 int)
insert into @Persons (Age1, Age2, Age3, Age4)
select ISNULL(Age1, case when Num>= 1 then 18 else -1 end) Age1
, ISNULL(Age2, case when Num>= 2 then 18 else -1 end) Age2
, ISNULL(Age3, case when Num>= 3 then 18 else -1 end) Age3
, ISNULL(Age4, case when Num>= 4 then 18 else -1 end) Age4
from (
select Persons.Person.value('@num','smallint') as Num
,Persons.Person.value('Person[@age<18][1]/@age','smallint') as Age1
,Persons.Person.value('Person[@age<18][2]/@age','smallint') as Age2
,Persons.Person.value('Person[@age<18][3]/@age','smallint') as Age3
,Persons.Person.value('Person[@age<18][4]/@age','smallint') as Age4
from @XmlData.nodes('/Persons') Persons(Person)
) Persons
select *
from @Persons
Результат
5 18 18 -1