سؤال

لقد قمت باستيراد مستند 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>

ولكن مع إعدادك الحالي ، أعتقد أنك ستتعرض لضغوط شديدة للعثور على حل جيد ....

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top