모든 XML 노드를 SQL Server로 반환합니다
-
20-09-2019 - |
문제
XML 문서를 SQL Server로 가져 왔으며 이제 다양한 부품을 다른 테이블로 가져 오려고 노력하고 있습니다. 아래 쿼리를 사용하면 Hotel_Facities의 한 행만 반환하면 Hotel_Ref와 함께 모든 Hotel_Facities를 반환해야합니다.
DECLARE @Details xml
SET @Details = '<hotels>
<hotel>
<hotel_ref>105</hotel_ref>
<hotel_facilities>
<id>2</id>
<name>Disabled Facilities</name>
<id>4</id>
<name>24 Hour Reception</name>
<id>12</id>
<name>Restaurant</name>
</hotel_facilities>
</hotel>
</hotels>'
SELECT tab.col.value('../hotel_ref[1]','varchar(100)') AS 'hotel_ref',
tab.col.value('./id[1]','varchar(100)') AS 'HotelFacilityID',
tab.col.value('./name[1]','varchar(100)') AS 'HotelFacilityName'
FROM @Details.nodes('//hotels/hotel/hotel_facilities') AS tab(col)
해결책
나는 marc_s에 동의합니다 XML에는 좋은 스키마가 없습니다.
내가 얻을 수있는 가장 가까운 것은 다음과 같습니다.
SELECT tab.col.value('./hotel_ref[1]','varchar(100)') AS 'hotel_ref',
fac.value('(.)[1]','varchar(100)') AS 'HotelFacilityID',
ROWID=IDENTITY(int,1,1)
into #facilitiesid
FROM @Details.nodes('/hotels/hotel') AS tab(col)
cross apply col.nodes('.//id') a(fac)
SELECT tab.col.value('../hotel_ref[1]','varchar(100)') AS 'hotel_ref',
fac.value('(.)[1]','varchar(100)') AS 'HotelFacilityName',
ROWID=IDENTITY(int,1,1)
into #facilitiesnames
FROM @Details.nodes('//hotels/hotel/hotel_facilities') AS tab(col)
cross apply col.nodes('.//name') a(fac)
select i.hotel_ref, HotelFacilityID, HotelFacilityName
from #facilitiesid i
inner join #facilitiesnames n
on i.rowid = n.rowid
다른 팁
귀하의 XML은 약간 재미 있습니다 <hotel_facilities>
당신이 열거 할 수있는 적절한 "하위 엔티티"가 포함되어 있지 않습니다.
시설이 a로 싸인 경우 <facility>....</facility>
요소, 당신은 그것을 쉽게 열거 할 수 있습니다.
<hotel_facilities>
<facility>
<id>2</id>
<name>Disabled Facilities</name>
</facility>
<facility>
<id>4</id>
<name>24 Hour Reception</name>
</facility>
<facility>
<id>12</id>
<name>Restaurant</name>
</facility>
</hotel_facilities>
그러나 현재 설정을 통해 좋은 솔루션을 찾기가 어려울 것 같아요 ....
제휴하지 않습니다 StackOverflow