我在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
注意:我尝试了节点和值选项,但没有一个能帮助我获取标签之间的相关值。
答案 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