2009-05-15 13 views
18

Obecnie próbuję uzyskać wszystkie atrybuty z niektórych XML z zapytaniem SQL.Serwer SQL: Jak zdobyć atrybuty XML w zapytaniu?

Próbowałem odzyskać to, ale brakuje mi czegoś fundamentalnego.

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) 

Odpowiedz

48

Trzeba by spróbować czegoś takiego: (atrybut @name jest na "Item" element - nie "Pozycje"!)

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

Dziękuję bardzo! –

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

Oto twoja odpowiedź. Proszę wiedzieć, że w sql istnieje typ XML, więc nie trzeba używać varcharu, a następnie przesyłać go do xml. –

+0

Ta odpowiedź jest bardziej poprawna, jeśli potrzeba * wszystkich * danych wewnątrz elementu 'Field'. – Serg

Powiązane problemy