2009-05-15 8 views
18

J'essaye actuellement d'obtenir tous les attributs de quelque XML avec une requête SQL.SQL Server: Comment obtenir des attributs XML dans une requête?

J'ai essayé ce qui suit pour le récupérer, mais il me manque quelque chose de fondamental.

DECLARE @T varchar(max) 
SET @T = 
'<root> 
    <Field FieldRowId="1000"> 
    <Items> 
     <Item Name="CODE"/> 
     <Item Name="DATE"/> 
    </Items> 
     <Attributes> 
     <Attribute ID ="1"/> 
     </Attributes> 
    </Field> 
    <Field FieldRowId="2000"> 
    <Items> 
       <Item Name="CODE"/> 
       <Item Name="DATE"/> 
    </Items> 
    <Attributes> 
     <Attribute ID ="2"/> 
    </Attributes> 
    </Field> 
</root>' 

DECLARE @X xml 

SET @X = CAST(@T as xml) 
SELECT Y.ID.value('@FieldRowId', 'int') as FieldID, 
    Y.ID.value('/Items/@Name', 'varchar(max)') as "Name", 
    Y.ID.value('/Attributes/@ID', 'int') as AttributeID 
FROM @X.nodes('/root/Field') as Y(ID) 

Répondre

48

Vous devez essayer quelque chose comme ceci: (l'attribut @name est sur l'élément "Item" - et non pas les "Articles"!)

SET @X = CAST(@T as xml) 
SELECT 
    Y.ID.value('(@FieldRowId)[1]', 'int') as FieldID, 
    Y.ID.value('(Items/Item/@Name)[1]', 'varchar(max)') as "Name", 
    Y.ID.value('(Attributes/Attribute/@ID)[1]', 'int') as AttributeID 
FROM @X.nodes('/root/Field') as Y(ID) 

Marc

+0

Merci beaucoup! –

1
SELECT t1.fieldId, name, attributeId 
FROM (SELECT Y.ID.value('../../@FieldRowId', 'int') as FieldID 
    , Y.ID.value('@Name', 'varchar(max)') as Name  
FROM @T.nodes('(/root/Field/Items/Item)') as Y(ID) 
) t1 -- alias the first result 
JOIN 
(SELECT Y.ID.value('../../@FieldRowId', 'int') as FieldID 
    , Y.ID.value('@ID', 'int') as AttributeID 
FROM @T.nodes('(/root/Field/Attributes/Attribute)') as Y(ID) 
) t2 -- alias the second result 
on t1.fieldid = t2.FieldID -- join them on a common column 
+1

Voici votre réponse. Sachez qu'il existe un type XML sur sql pour que vous n'ayez pas besoin d'utiliser un varchar puis de le convertir en xml. –

+0

Cette réponse est plus correcte si l'on a besoin de * toutes * les données dans l'élément 'Field'. – Serg

Questions connexes