Разобрать XML значений - PullRequest
       27

Разобрать XML значений

0 голосов
/ 30 апреля 2020

Я новичок в мире разбора XML, и мне нужно извлечь значение c из поля 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

1 Ответ

2 голосов
/ 30 апреля 2020

Как уже упоминалось @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 |
+--------+------+
...