2009-05-15 4 views
18

Ich versuche derzeit, alle Attribute aus einigen XML mit einer SQL-Abfrage zu erhalten.SQL Server: Wie erhalten Sie XML-Attribute in einer Abfrage?

Ich habe folgendes versucht, um es zu erhalten, aber ich muss etwas Grundlegendes vermissen.

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) 

Antwort

48

würden Sie haben so etwas versuchen: (das @name Attribut ist auf dem "Item" Element - nicht die "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

+0

Vielen Dank! –

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

Hier ist Ihre Antwort. Bitte beachten Sie, dass es einen XML-Typ auf sql gibt, so dass Sie kein varchar verwenden müssen und dann nach xml umwandeln müssen. –

+0

Diese Antwort ist korrekter, wenn man * alle * Daten innerhalb des 'Feld'-Elements benötigt. – Serg

Verwandte Themen