XMLは以下に添付されています。私が使用しているクエリは、各ポストコードに適用されたアドレス行を返すことです。SQL ServerでネストされたXMLノードを操作する
誤った出力:
Code Reaper PC1 PC1_AL1 PC1_AL2
Code Reaper PC1 PC2_AL1 PC2_AL2
Code Reaper PC1 PC3_AL1 PC3_AL2
... 9 rows in total
私は以下の予想される出力を得るにはどうすればよいですか?基本的には、私はそれの隣にあるそれぞれのポストコードのアドレス行だけを必要とします。
Code Reaper PC1 PC1_AL1 PC1_AL2
Code Reaper PC2 PC2_AL1 PC2_AL2
Code Reaper PC3 PC3_AL1 PC3_AL2
これは私が試みているものです。あなたのFROM
句から
DECLARE @XMLDocument XML
SET @XMLDocument = N'<People><Person>
<PersonDetails>
<Surname>Code</Surname>
<Forename>Reaper</Forename>
</PersonDetails>
<HomeInformation>
<Address>
<PostCode>PC1</PostCode>
<AddressLines>
<AddressLine1>PC1_AL1</AddressLine1>
<AddressLine2>PC1_AL2</AddressLine2>
</AddressLines>
</Address>
<Address>
<PostCode>PC2</PostCode>
<AddressLines>
<AddressLine1>PC2_AL1</AddressLine1>
<AddressLine2>PC2_AL2</AddressLine2>
</AddressLines>
</Address>
<Address>
<PostCode>PC3</PostCode>
<AddressLines>
<AddressLine1>PC3_AL1</AddressLine1>
<AddressLine2>PC3_AL2</AddressLine2>
</AddressLines>
</Address>
</HomeInformation>
</Person>
</People>
'
SELECT
[Surname],
[GivenName],
[PostCode],
[AddressLine1],
[AddressLine2]
FROM
(SELECT
ISNULL(Person.PersonDetails.value('Surname[1]', 'nvarchar(max)'),'') AS [Surname],
ISNULL(Person.PersonDetails.value('Forename[1]', 'nvarchar(max)'),'') AS [GivenName],
ISNULL(HomeInformation.[Address].value('PostCode[1]', 'nvarchar(max)'),'') AS [PostCode],
ISNULL(HomeInformationAddress.AddressLines.value('AddressLine1[1]', 'nvarchar(max)'),'') AS [AddressLine1],
ISNULL(HomeInformationAddress.AddressLines.value('AddressLine2[1]', 'nvarchar(max)'),'') AS [AddressLine2]
FROM
@XMLDocument.nodes('People/Person/PersonDetails') AS Person(PersonDetails)
OUTER APPLY
PersonDetails.nodes('../HomeInformation/Address') HomeInformation([Address])
OUTER APPLY
PersonDetails.nodes('../HomeInformation/Address/AddressLines') HomeInformationAddress(AddressLines)
) as X
あなたはこれを試してみましたでしょうか? 2番目の '../'は間違っています。あなたの解決策は正しく返されません...最初の問題は '.nodes()'への最初の呼び出しが深くまで潜ることです...あなたの提案は原則的に正しいですが、この初期の問題は修復されません。より正確に前方にナビゲートする方がいいです... – Shnugo
答えをありがとう。私は最後の行で訂正をしなければならなかった "OUTER APPLY HomeInformation.Address.nodes( 'AddressLines')HomeInformationAddress(AddressLines)'しかし、なぜ私のコードが動作していなかったのかを知る必要があった。 1つは修正です。 – CodeReaper
@ Shnugoはい、あなたは正しいです。残念ながら、私は自分のiPhoneにSQL Serverを持っていないので、いつも私の答えをテストすることはできません。 – RBarryYoung