【问题标题】:SQL convert multi level xml with attribute into tableSQL将具有属性的多级xml转换为表
【发布时间】:2013-11-07 01:20:20
【问题描述】:

我有下面的 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) 列提供 NULL 值。

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)

【问题讨论】:

    标签: sql sql-server xml sqlxml


    【解决方案1】:

    试试这个查询

      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);
    

    【讨论】:

      【解决方案2】:
      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 fiddle demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-28
        • 1970-01-01
        • 2016-08-01
        相关资源
        最近更新 更多