首页 > 解决方案 > 如何从具有不同节点的 XML 中获取数据作为 SQL Server 中的列

问题描述

我有一个 XML,我试图从 XML 中按表名选择行,但每个节点上的列数不同。

下面是我的 XML:

<tables>
    <table>
      <name>Table1</name>
       <attr>
         <id>1</id>
         <col1>123</col1>
          <col2>345</col2>
       </attr>
        <attr>
         <id>2</id>
         <col3>123</col3>
       </attr>
        <attr>
         <id>4</id>
          <col2>123</col2>
       </attr>
    </table>
</tables> 

现在我通过以下查询进行查询:

SELECT T.N.VALUE('id','nvarchar(100)') as id,
       T.N.VALUE('col1','nvarchar(100)') as col1,
       T.N.VALUE('col2','nvarchar(100)') as col2,
       T.N.VALUE('col3','nvarchar(100)') as col3 
FROM @input.nodes('/tables/table/attr') AS T(N) 
CROSS APPLY @input.nodes('/tables/table/name') AS S(N) 
WHERE S.N.value('name','varchar(100)')='Table1'

但我得到一个错误

XQuery [value()]: 'value()' 需要一个单例(或空序列),找到类型为 'xdt:untypedAtomic *' 的操作数

但我期望得到:

id | col1 | col2 | col3
---+------+------+------
 1 | 123  | 345  | NULL
 2 | NULL | NULL | 123
 4 | NULL | 123  | NULL

标签: sql-serverxmlxquery

解决方案


像这样:

declare @input xml = '<tables>
    <table>
      <name>Table1</name>
       <attr>
         <id>1</id>
         <col1>123</col1>
          <col2>345</col2>
       </attr>
        <attr>
         <id>2</id>
         <col3>123</col3>
       </attr>
        <attr>
         <id>4</id>
          <col2>123</col2>
       </attr>
    </table>
</tables> 
'


SELECT a.N.value('(id)[1]','nvarchar(100)') as id,
       a.N.value('(col1)[1]','nvarchar(100)') as col1,
       a.N.value('(col2)[1]','nvarchar(100)') as col2,
       a.N.value('(col3)[1]','nvarchar(100)') as col3 
FROM @input.nodes('/tables/table') AS t(N) 
CROSS APPLY T.N.nodes('attr') AS a(N) 
WHERE t.N.value('(name)[1]','varchar(100)')='Table1'

推荐阅读