【问题标题】:SQL convert XML with same nodes to datasetSQL将具有相同节点的XML转换为数据集
【发布时间】:2019-06-06 20:19:36
【问题描述】:

我有一个节点名称相同的 XML 列。

这就是 XML 列的样子。它有三个Mapping 节点。

<Mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Mapping>
    <ID>1</ID>
    <Name>John</Name>
  </Mapping>
  <Mapping>
    <ID>2</ID>
    <Name>Jill</Name>
  </Mapping>
  <Mapping>
    <ID>3</ID>
    <Name>Jason</Name>
  </Mapping>
</Mappings>

预期结果集

   ID          Name
------------------------
   1           John
   2           Jill
   3           Jason

这就是我尝试做的事情

select
    convert(varchar(50), ID.query('./text()')) as ID,
    convert(varchar(50), fName.query('./text()')) as [Name]
from [MyTable]
cross apply XMLCol.nodes('/Mappings/Mapping/ID') as map1(ID)
cross apply XMLCol.nodes('/Mappings/Mapping/Name') as map2(fName)

这对所有 3 个名称重复 ID 3 次。

我只想用相应的名称重复一次 ID。

【问题讨论】:

    标签: sql sql-server xml tsql


    【解决方案1】:

    你很亲密。试试

    示例

    Select ID     = xAttr.value('ID[1]', 'int')
          ,[Name] = xAttr.value('Name[1]', 'varchar(100)')
     From  YourTable A
     Cross Apply XMLCol.nodes('/Mappings/Mapping') B(xAttr)
    

    退货

    ID  Name
    1   John
    2   Jill
    3   Jason
    

    【讨论】:

    • Mappings XMLCol.nodes('//Mappings/Mapping') 开头有两个斜线是否有原因?我用一个斜杠进行了测试,效果很好。只是想知道它是一个错字还是你背后的原因。谢谢
    • @nmess88 没有理由。 1个斜线也可以。只是一个懒惰的复制/粘贴
    • 在这种情况下,即使是开头的单斜线也不需要。
    • 补充一点:// 触发深度搜索。它将找到&lt;Mappings&gt; XML 中的任何位置。在较大的结构中,这可能会花费很多,并且可能会返回意想不到的结果……顺便提一下:(ID/Text())[1] 的性能优于ID[1]。无论如何,从我这边 +1 ;-)
    • @AlexKudryashev 关于不需要斜线:使用单斜线告诉引擎“从根节点开始!”。没有斜线告诉引擎“这是一个相对路径。从当前​​节点开始!”。在这种情况下,效果是一样的,但最好知道差异;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2019-07-11
    • 2016-11-16
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多