【发布时间】:2017-07-25 05:53:45
【问题描述】:
我在 SQL Server 中有以下 XML,并希望对其进行迭代以生成结构化消息。
<aggregate type="ApplicationForm">
<entity type="Form" root="true" id="d799728b-7973-4046-b60f-cb25d4ee385c">
<attribute name="creationDate" multivalue="false">2017-01-16</attribute>
<attribute name="product" multivalue="false">Abc</attribute>
<relation name="r_PersonMain" multivalue="false">4808f654-f480-412c-8dc5-d29c6c811602</relation>
<relation name="r_PersonPayer" multivalue="false">a8e9eaf2-56a5-4f88-955b-19eb98f6e882</relation>
</entity>
<entity type="Payment" root="true" id="e197bf66-1e35-42a9-bdc0-0674e3a0f765">
<attribute name="totalAnnualPremium" multivalue="false">328415.81</attribute>
<relation name="r_PaymentMethodRecurring" multivalue="false">b8b3c652-b886-44aa-a75b-b2d3ecd6c064</relation>
<relation name="r_PaymentMethodFirst" multivalue="false">f3d91f99-ff6a-4888-a663-24e42ecc7342</relation>
<attribute name="term" multivalue="false">01</attribute>
</entity>
<entity type="Person" root="false" id="4808f654-f480-412c-8dc5-d29c6c811602">
<relation name="r_AddressWork" multivalue="false">cae83657-47c2-49bd-a588-7685271c4766</relation>
<attribute name="idNumber" multivalue="false">1112223334447</attribute>
<relation name="r_SelectionItem" multivalue="true">...</relation>
<relation name="r_Health" multivalue="false">07d08bd6-ec73-4710-9de4-23435cd2b088</relation>
<relation name="r_AddressCurrent" multivalue="false">56d17bda-e332-497e-8e22-e7b7f09f996d</relation>
<attribute name="lastName" multivalue="false"> 1</attribute>
<attribute name="jobDescription1" multivalue="false"/>
<relation name="r_Behavior" multivalue="false">2db2c23a-37dd-4857-87b4-005aa87b2c2d</relation>
<attribute name="email" multivalue="false"></attribute>
<relation name="r_AddressRegistered" multivalue="false">ce79a468-fb26-4996-91a8-82954d960855</relation>
<attribute name="telephoneExtention1" multivalue="false"/>
<relation name="r_Occupation1" multivalue="false">b7b69acc-2945-4f64-8ffd-4537849280f5</relation>
</entity>
</aggregate>
顶部元素包含一长串entity 标签。每个都包含两个元素,attribute 和 relation。 attribute 包含直接值,而 relation 包含对另一个 entity 标记的引用,该标记又包含 attribute 或 relation。
为了挑选出entity 表单(第一个标签),它需要对其及其所有引用进行迭代,直到检索到所有引用的entities。
我可以检索第一个实体及其关系(引用实体),然后我访问它的第二级引用实体,然后我再次检查它内部是否有另一个“关系”标签,然后我也必须访问它。
问题是,这种方法不是动态的,不能自动检索所有引用的项目。
问:- 如何动态访问所有引用的实体及其属性,直到不再有引用的实体。
问:- 我还想根据每个属性或实体“名称”标签为我的自定义名称分配标签。例如,creationDate、product。
这是我的问题。
DECLARE @xml xml
SET @xml =(Select CAST( CAST([AAHAD].[dbo].[aq_aggregate].data AS NVARCHAR(MAX)) AS XML )
FROM [AAHAD].[dbo].[aq_aggregate]
WHERE [AAHAD].[dbo].[aq_aggregate].[aggregateId] = 2
FOR XML RAW, TYPE)
SELECT @xml.query('
let $xml := (/row/aggregate)
let $form := (/row/aggregate/entity[@type="Form"])
return
<Form>
<attributes>
{
for $form_attrs in ($form/attribute)
return <attribute><name>{ data($form_attrs/@name) } </name><value>{ data($form_attrs) }</value></attribute>
}
</attributes>
<relations>
{
for $form_rel in ($form/relation)
let $form_rel_id := data($form_rel)
let $relation :=($xml/entity[@id=$form_rel_id])
return
<relation>
<attributes>
{
for $innerRel_attrs in ($relation/attribute)
return <attribute><name>{ data($innerRel_attrs/@name) } </name><value>{ data($innerRel_attrs) }</value></attribute>
}
</attributes>
<relations>
{
for $innerRel_rel in ($relation/relation)
let $inner_Rel_id := data($innerRel_rel)
let $inner_Relation :=($xml/entity[@id=$inner_Rel_id])
return
<relation>
<attributes>
{
for $inner2Rel_attrs in ($inner_Relation/attribute)
return <attribute><name>{ data($inner2Rel_attrs/@name) } </name><value>{ data($inner2Rel_attrs) }</value></attribute>
}
</attributes>
<relations>
{
for $inner2Rel_rel in ($inner_Relation/relation)
return <relation>{ ($inner2Rel_rel) }</relation>
}
</relations>
</relation>
}
</relations>
</relation>
}
</relations>
</Form>
')
【问题讨论】:
标签: sql-server xml sql-server-2008-r2 sqlxml xquery-sql