إرجاع جميع العقد XML استيراد إلى SQL Server
-
20-09-2019 - |
سؤال
لقد قمت باستيراد مستند XML إلى SQL Server ، أحاول الآن استيراد أجزاء مختلفة إلى جداول مختلفة. عندما أستخدم الاستعلام أدناه ، فإنه يعيد صفًا واحدًا فقط من Hotel_Facilities ، فأنا بحاجة إلى إعادة جميع Hotel_Facilities مع Hotel_ref.
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>
لا يحتوي على "دخول فرعي" مناسب يمكنك تعداده ...
إذا كانت مرافقك ملفوفة في <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