解析 XML 个值
Parse XML values
我是 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
正如@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);
Output
+--------+------+
| RECID | c4 |
+--------+------+
| 100002 | 200 |
| 100003 | 2000 |
+--------+------+
我是 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
正如@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);
Output
+--------+------+
| RECID | c4 |
+--------+------+
| 100002 | 200 |
| 100003 | 2000 |
+--------+------+