2009-05-15 48 views
18

Tôi hiện đang cố gắng lấy tất cả các thuộc tính từ một số XML bằng truy vấn SQL.SQL Server: Làm thế nào để giữ các thuộc tính XML trong một truy vấn?

Tôi đã cố gắng sau đây để truy xuất nó, nhưng tôi phải thiếu điều gì đó khá cơ bản.

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) 

Trả lời

48

Bạn sẽ phải cố gắng một cái gì đó như thế này: (thuộc tính @name là trên các yếu tố "Item" - không phải là "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

Cảm ơn bạn rất nhiều! –

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

Đây là câu trả lời của bạn. Xin vui lòng biết rằng có một loại XML trên sql để bạn không cần phải sử dụng một varchar sau đó đúc thành xml. –

+0

Câu trả lời này chính xác hơn nếu bạn cần * tất cả * dữ liệu bên trong phần tử 'Field'. – Serg

Các vấn đề liên quan