2017-08-16 3 views
2

入れ子になったXML要素をどのようにプルしてSQLのテーブル結果にするかを考えています。 WorkItemには常にグループがありますが、グループフィールドはN回ネストできます。このようなXMLフィールドのうちのフィールドだけを引っ張るための簡単な方法があります: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

私は[、(すぐに使用できるサンプルデータのための1)をrextesterためにあなたのサンプルをコピーして貼り付け私は問題を再現できません。](http://rextester.com/DRNX91743) –

+0

Btw:対応するSPを用意して文書を削除するための 'FROM OPENXML'は古くなっており、これ以上使用することはできません例外が存在する)。むしろ適切な[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で間違って貼り付けられました。 Group要素はネストされている必要があります。 –

+0

@DanChampagne、ok。私は自分の答えを編集しました。それを確認してください。 –

+0

Brilliant!どうもありがとうございます!それは完全に働いた:) –

関連する問題