解析 SQL 服务器中的 XML 列

Parse XML column in SQL Server

我在 SQL 服务器中有一个 XML 列。下面的示例数据

<row id="AC.1.TR.AUD.12800............" xml:space="preserve">
  <c1>AC</c1>
  <c2>1</c2>
  <c3>TR</c3>
  <c4>AUD</c4>
  <c5>12800</c5>
  <c17>20150129</c17>
  <c18>CREDIT</c18>
  <c18 m="2">DEBIT</c18>
  <c19>4289540.22</c19>
  <c19 m="2">-17955</c19>
  <c20 m="2" />
  <c21 m="2" />
  <c22>52287350.51</c22>
  <c22 m="2">-218862.47</c22>
  <c23>-688471.2</c23>
  <c23 m="2" />
  <c24 m="2">2881.77</c24>
  <c32 />
</row>

从 c18 列开始到 c24 列都是关联的。如果 18 有两套,则有两组。但是,两组中none个标签是强制性的。我需要将它们解析为正常的 table 结构。

这是正确的输出:

RECID                        C18         C19       C22           C23      C24
AC.1.TR.AUD.12800.........  CREDIT   428950.22  52287350.51   -688471.2               
AC.1.TR.AUD.12800.........  DEBIT    -17955.00   -218862.47              2881.77

注意:我尝试了节点和值选项,但 none 正在帮助我获取标签之间的相关值。

您可以使用 PIVOT 将行数据放入列中:

SELECT ID, C18,C19,C22,C23,C24
FROM
    (
    SELECT 
        Loc.value('../@id', 'varchar(255)') ID,
        isnull(Loc.value('@m', 'varchar(100)'),'') m,
        Loc.value('local-name(.)[1]', 'varchar(100)') c,
        Loc.value('.', 'varchar(100)') cValue
    FROM @XML.nodes('/row/child::node()') as T(Loc)
    ) AS SourceTable
PIVOT
    (
    Max(cValue)
    FOR c IN (C18,C19,C22,C23,C24)
    ) AS PivotTable
order by 1, 2