2009-05-15 10 views
18

Actualmente estoy tratando de obtener todos los atributos de algunos XML con una consulta SQL.Servidor SQL: ¿cómo obtener atributos XML en una consulta?

He estado intentando lo siguiente para recuperarlo, pero me falta algo fundamental.

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) 

Respuesta

48

Usted tendría que intentar algo como esto: (el atributo @Name está en el elemento "artículo" - no a los "Artículos"!)

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

¡Muchas gracias! –

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

Aquí está su respuesta. Tenga en cuenta que hay un tipo XML en sql para que no necesite usar un varchar y luego convertirlo a xml. –

+0

Esta respuesta es más correcta si se necesitan * todos * datos dentro del elemento 'Campo'. – Serg

Cuestiones relacionadas