考虑下面的XML的最佳方式:使用XQuery来提取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
在给定的例子中,有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
如何将年龄存储为临时表中的行,然后使用数据透视查询(通过排序)将它们作为一行移动到最终表结构中? – Tony 2011-05-20 10:06:47