Experimente esta consulta
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);
Pergunta
Eu tenho o XML abaixo que estou tentando converter em uma tabela.
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>'
Como posso transformar o XML acima em uma estrutura de tabela como abaixo:
ItemID ObjID
100 0001
100 0002
100 0003
100 0004
200 0001
200 0002
200 0003
200 0004
Eu tentei a declaração abaixo, mas ela continua chegando com valores nulos para ambas as colunas (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)
Solução
Experimente esta consulta
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);
Outras dicas
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)