在SQL Server中解析XML列

时间:2015-06-23 13:40:26

标签: sql-server xml-parsing

我在SQL Server中有一个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中有两组,则会有两组。但是,这两组中的标签都不是必需的。我需要将它们解析为普通的表结构。

这是正确的输出:

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

注意:我尝试了节点和值选项,但没有一个能帮助我获取标签之间的相关值。

1 个答案:

答案 0 :(得分:0)

您可以使用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