Try this Query
SELECT
Tbl.Col.value('../@ItemID', 'nvarchar(16)') as [ItemID],
Tbl.Col.value('@ObjID', 'nvarchar(16)') as [ObjID]
FROM
@x.nodes('root/items/item/obj') Tbl(Col);
Question
I've the xml below which I'm trying to convert into a table.
declare @X xml =
'<root>
<items>
<item ItemID="100">
<obj ObjID="0001" value="val1"/>
<obj ObjID="0002" value="val2"/>
<obj ObjID="0003" value="val3"/>
<obj ObjID="0004" value="val4"/>
</item>
<item ItemID="200">
<obj ObjID="0001" value="val1"/>
<obj ObjID="0002" value="val2"/>
<obj ObjID="0003" value="val3"/>
<obj ObjID="0004" value="val4"/>
</item>
</items>
</root>'
How can I transform the above xml into a table structure like below:
ItemID ObjID
100 0001
100 0002
100 0003
100 0004
200 0001
200 0002
200 0003
200 0004
I've tried the statement below but it keeps on coming with NULL values for both (ItemID, ObjID) columns.
select
t.col.value('(/item/@ItemID)[1]', 'nvarchar(16)') as [ItemID],
t.col.value('(/item/obj/@ObjID)[1]', 'nvarchar(16)') as [ObjID]
from
@X.nodes('/root/items') as t(col)
Solution
Try this Query
SELECT
Tbl.Col.value('../@ItemID', 'nvarchar(16)') as [ItemID],
Tbl.Col.value('@ObjID', 'nvarchar(16)') as [ObjID]
FROM
@x.nodes('root/items/item/obj') Tbl(Col);
OTHER TIPS
select
i.col.value('@ItemID', 'nvarchar(16)') as [ItemID],
o.col.value('@ObjID', 'nvarchar(16)') as [ObjID]
from @X.nodes('/root/items/item') as i(col)
outer apply i.col.nodes('obj') as o(col)