解析 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
我在 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