2017-08-16 35 views
2

我試圖找出如何拉嵌套的XML元素,並把它變成在SQL表中的結果。一個WorkItem總是有一個組,但Group字段可以嵌套N次。有沒有一種簡單的方法,只是拉出來的字段,看起來像這樣的XML領域:提取元素在SQL

declare @xml XML = ' 
<WorkItem> 
    <Group Name="Base" > 
    <Field FieldId="361" Name="Assigned To" /> 
    <Field FieldId="362" Name="Stuff" /> 
    <Group Name="Detail"> 
     <Field FieldId="363" Name="Assigned To 2" /> 
    </Group> 
    </Group> 
</WorkItem>' 

declare @handle int 
declare @status int 

exec @status = sp_xml_preparedocument @handle output, @xml 
select * 
from openxml(@handle, 'WorkItem/Group/Field') 
with (
    FieldId int, 
    Name varchar(max) 
) 
exec sp_xml_removedocument @handle 

什麼我越來越:

361,Assigned To 
362,Stuff 

我很期待:

361,Assigned To 
362,Stuff 
363,Assigned To 2 

謝謝!

+2

我複製並粘貼您的樣品rextester(+1對於準備使用的樣本數據),[但我不能重現該問題](http://rextester.com/DRNX91743) –

+0

順便說一下:'FROM OPENXML'與相應的SP準備和去除文檔是過時的,並且不應被使用的任何更多(稀土例外情況)。而是使用適當的[XML數據類型提供的方法](https://msdn.microsoft.com/en-us/library/ms190798.aspx)。 – Shnugo

回答

5

我認爲這是更好地使用XQuery

DECLARE @xml XML = ' 
<WorkItem> 
    <Group Name="Base" > 
    <Field FieldId="361" Name="Assigned To" /> 
    <Field FieldId="362" Name="Stuff" /> 
    <Group Name="Detail"> 
     <Field FieldId="363" Name="Assigned To 2" /> 
    </Group> 
    </Group> 
</WorkItem>'; 


SELECT 
    n.value('@FieldId', 'int') FieldId, 
    n.value('@Name', 'varchar(250)') Name 
FROM 
    @xml.nodes('/WorkItem//Field') xml(n); 

輸出:

FieldId  Name 
----------- -------------------- 
361   Assigned To 
362   Stuff 
363   Assigned To 2 
+0

這有效,但我在我的XML中剪切和粘貼錯誤。組元素應該已嵌套。 –

+0

@DanChampagne,好的。我編輯了我的答案。覈實。 –

+0

太棒了!非常感謝!它工作完美:) –