首页 > 解决方案 > 将多个 xml 元素分解为多个列

问题描述

我正在尝试将此 xml 列分解为多个 xml 列,但它似乎格式错误。

这是我使用 xml path() 的数据

<claim id="1111111">
  <InsHistDB>2</InsHistDB>
  <ClaimHistID>111111</ClaimHistID>
  <PatID>00000001</PatID>
  <ProcedureData>
    <row proc_logid="0000009" proc_logdb="1000000" createdate="2000-09-21T00:00:00" pldate="2000-09-21T00:00:00" adacode="D0120" />
    <row proc_logid="1211557" proc_logdb="1000010" createdate="2015-09-21T00:00:00" pldate="2015-09-21T00:00:00" adacode="D0220" />
    <row proc_logid="1211558" proc_logdb="1000010" createdate="2015-09-21T00:00:00" pldate="2015-09-21T00:00:00" adacode="D0230" />
    <row proc_logid="1211556" proc_logdb="1000010" createdate="2015-09-21T00:00:00" pldate="2015-09-21T00:00:00" adacode="D0272" />
  </ProcedureData>
</claim>

select语句目前是这个

SELECT TOP (1000)  [ClaimID] as '@id'
      ,[InsHistDB]
      ,[ClaimHistID]
      ,[PatID]
   -- ,[ProcedureData].value('declare namespace ns= "ProcedureData"; (/ns:ProcedureData/ns:row[1])','nvarchar(50)') as pp
     ,[ProcedureData]
     --,[ProcedureData].query('proc_logid').value('.','varchar(50)') as 'proc_1'
  FROM [Mine].[dbo].[claim]
  where claimid=1111111

 FOR XML PATH('claim')

我想要做的是将 {Proc_Log_id} 分成不同的列,以便该行应该读取。

Claim ID         INSHISTDB       CLaimHistID       PATID      Proc_Id1      Proc_ID2      ProcID3   procID4
 11111              2               1111111      000000001     0000009    1211557        1211558      1211556                   

这是可能的还是我只是在旋转我的轮子?这也适用于多个 patid,因此预期没有 where 子句的查询。另外我相信每个 xml 数据点最多可以有 10 个 proc_logid。我对空值很好,因为我计划对这些数据进行透视和规范化。

谢谢阅读。

标签: sqlsql-serverxml

解决方案


选择第三个节点的语法是column.value('(/foo/bar)[3]','varchar(25)').

您考虑其他选择是正确的。特别是“查询”或“节点”函数更适合,因为它们可以将值作为第二个结果集或新的 XML 文档返回。


推荐阅读