이 쿼리를 시도하십시오
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);
문제
나는 아래의 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
아래의 진술을 시도했지만 (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)
해결책
이 쿼리를 시도하십시오
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);
다른 팁
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)