18 votes

SQL Server : Comment s'emparer des attributs XML dans une requête ?

J'essaie actuellement d'obtenir tous les attributs d'un fichier XML à l'aide d'une requête SQL.

J'ai essayé de le récupérer de la manière suivante, mais je dois manquer 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)

48voto

marc_s Points 321990

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

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

1voto

Sergio Guerrero Points 21
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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X