SQL конвертирует многоуровневый XML с атрибутом в таблицу

У меня есть xml ниже, который я пытаюсь преобразовать в таблицу.

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>'

Как я могу преобразовать приведенный выше xml в структуру таблицы, как показано ниже:

ItemID    ObjID
100       0001
100       0002
100       0003
100       0004
200       0001
200       0002
200       0003
200       0004

Я пробовал приведенный ниже оператор, но он продолжает приходить со значениями NULL для обоих столбцов (ItemID, ObjID).

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)

person Felasfaw    schedule 07.11.2013    source источник


Ответы (2)


Попробуйте этот запрос

  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);
person Subin    schedule 07.11.2013

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)

демонстрация скрипки sql

person Roman Pekar    schedule 07.11.2013