我尝试使用OPENXML功能组合来自不同节点的信息。例如,使用以下xml数据我想尽可能多地填写数据并根据' PartyId'加入。所以我可以得到#PartyDoleCode'来自' MoreInfo':
script.py
我如何输出以下内容:
print("DONE")
答案 0 :(得分:1)
试试这样:
DECLARE @xml XML=
N'<Root>
<Parties>
<Party PartyId="Party_1">
<PartyTypeCode PartyTypeCode="Bastard"></PartyTypeCode>
<PersonInfo>
<FirstName>Jon</FirstName>
<LastName>Snow</LastName>
<Gender>M</Gender>
</PersonInfo>
<EmailAddress>knowsnothing@gmail.com</EmailAddress>
</Party>
<Party PartyId="Party_2">
<PartyTypeCode PartyTypeCode="Stark"></PartyTypeCode>
<PersonInfo>
<FirstName>Eddard</FirstName>
<LastName>Stark</LastName>
</PersonInfo>
</Party>
</Parties>
<MoreInfo>
<Parties>
<PartyRef PartyId="Party_1">
<PartyRole PartyRoleCode="Nights Watch"></PartyRole>
</PartyRef>
<PartyRef PartyId="Party_1">
<PartyRole PartyRoleCode="Wildling"></PartyRole>
</PartyRef>
<PartyRef PartyId="Party_2">
<PartyRole PartyRoleCode="Kings Hand"></PartyRole>
</PartyRef>
</Parties>
</MoreInfo>
</Root>';
- 查询将读取所有<Party>
元素,使用APPLY
阅读@PartyId
并使用其他APPLY
来阅读相关的<PartyRef>
元素@PartyId
作为结果集的sql:column()
列:
SELECT B.PartyID
,pr.value(N'(PartyRole/@PartyRoleCode)[1]',N'nvarchar(max)') AS PartyRoleCode
,p.value(N'(PersonInfo/FirstName/text())[1]',N'nvarchar(max)') AS FirstName
,p.value(N'(PersonInfo/LastName/text())[1]',N'nvarchar(max)') AS LastName
,p.value(N'(PersonInfo/Gender/text())[1]',N'nvarchar(max)') AS Gender
,p.value(N'(EmailAddress/text())[1]',N'nvarchar(max)') AS eMail
FROM @xml.nodes(N'/Root/Parties/Party') AS A(p)
OUTER APPLY(SELECT p.value(N'@PartyId','nvarchar(max)') AS PartyID) AS B
OUTER APPLY @xml.nodes(N'Root/MoreInfo/Parties/PartyRef[@PartyId=sql:column("B.PartyID")]') AS C(pr);