0

我是 XML 解析世界的新手,我需要从 XML 字段中提取特定值

这是我的 xml 结构:

CREATE TABLE [dbo].[tempb](
    [RECID] [nvarchar](255) NOT NULL,
    [XMLRECORD] [xml] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
INSERT [dbo].[tempb] ([RECID], [XMLRECORD]) VALUES (N'100002','<row xml:space="preserve" id="100002">
  <c1>NEWT880101</c1>
  <c2>NEWMAN </c2>
  <c3>FIRST</c3>
  <c4>200</c4>
  <c179 />
  <c179 m="2">T</c179>
  <c179 m="3">MAINLAND</c179>
  <c179 m="4">AG</c179>
  <c179 m="5">AG</c179>
  <c179 m="6">343</c179>
  <c179 m="7">2124</c179>
  <c179 m="182" />
  </row>
  ')

INSERT [dbo].[tempb] ([RECID], [XMLRECORD]) VALUES (N'100003','<row xml:space="preserve" id="100002">
  <c1>NEWT880101</c1>
  <c2>NEWMAN </c2>
  <c3>FIRST</c3>
  <c4>2000</c4>
  <c179 />
  <c179 m="2">T</c179>
  <c179 m="3">MAINLAND</c179>
  <c179 m="4">AG</c179>
  <c179 m="5">AG</c179>
  <c179 m="6">343</c179>
  <c179 m="7">2124</c179>
  <c179 m="182" />
  </row>
  ')

我需要将 C4 与 RECID 一起提取为新列

预期结果:

RECID c4

100002 200

100003 2000

4

1 回答 1

2

正如@AlwaysLearning 所暗示的,这是一个非常简单的案例。

为了清楚起见,我编辑了您的 XML。总的来说,您需要做的就是所谓的XML 粉碎。这是如何做到的。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (RECID INT PRIMARY KEY, XMLRECORD XML);
INSERT INTO @tbl (RECID, XMLRECORD) VALUES
( 100002, N'<row xml:space="preserve" id="100002">
        <c1>NEWT880101</c1>
        <c2>NEWMAN</c2>
        <c3>FIRST</c3>
        <c4>200</c4>
    </row>')
, (100003, N'<row xml:space="preserve" id="100002">
        <c1>NEWT880101</c1>
        <c2>NEWMAN</c2>
        <c3>FIRST</c3>
        <c4>2000</c4>
    </row>');
-- DDL and sample data population, end

SELECT RECID
    , col.value('(c4/text())[1]', 'VARCHAR(20)') AS c4
FROM @tbl AS tbl
    CROSS APPLY tbl.XMLRECORD.nodes('/row') AS tab(col);

输出

+--------+------+
| RECID  |  c4  |
+--------+------+
| 100002 |  200 |
| 100003 | 2000 |
+--------+------+
于 2020-04-30T13:47:25.657 回答