2010-01-12 6 views
0

J'ai importé un document XML dans SQL Server, j'essaie maintenant d'importer différentes parties dans différentes tables. Lorsque j'utilise la requête ci-dessous, elle ne renvoie qu'une seule ligne de hotel_facilities, je dois retourner toutes les hotel_facilities avec hotel_ref.Renvoyer tous les noeuds xml dans SQL Server

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) 

Répondre

0

Je suis d'accord avec marc_s Le XML ne dispose pas d'un bon schéma.

Le plus proche que je pouvais obtenir est:

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 
+0

Je cherchais quelque chose de similaire, mais depuis le « id » et éléments « nom » vraiment ne pas avoir une association entre eux à l'intérieur du noeud , J'ai peur qu'à un moment donné, vous finissiez par rassembler un identifiant et un nom qui ne sont pas ensemble ... mais honnêtement, je ne vois pas non plus une meilleure solution. –

+0

Vous aviez raison depuis le début, c'est un problème de schéma XML. J'ai juste supposé que Steve ne peut pas changer le schéma et que l'ordre des éléments XML détermine leur relation. Et vous avez encore raison que nous pourrions nous retrouver avec de mauvaises associations. –

+0

Je viens de recevoir le fichier XML et n'ai aucun contrôle sur elle. Le problème avec les deux solutions est que lorsque vous ajoutez un autre nœud d'hôtel avec ses fonctions hotel_files, les deux solutions répètent les nœuds pour chaque hôtel. – steve

2

Votre XML est structuré un peu drôle - le <hotel_facilities> ne contient pas un bon « sous-entité » que vous pouvez énumérer plus ......

Si vos installations seraient enveloppés dans un élément <facility>....</facility>, vous pourriez facilement l'énumérer.

<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> 

Mais avec votre configuration actuelle, je pense que vous serez aux abois pour trouver une bonne solution ....

Questions connexes