Как я могу разделить поле SQL, которое содержит строку XML - PullRequest
0 голосов
/ 01 октября 2019

У меня есть поле с фрагментами XML. Я хочу создать #TempTable, который будет содержать разделение данных XML, но отображать только символы между двумя конкретными тегами.

значение поля выглядит примерно так (обернуто для удобочитаемости):

<monthdate>2019-07-01</monthdate>
<automitemno>302</automitemno>
<amount>1.190000000000</amount>
<currentamount>0.000000000000</currentamount>
<langitemno>1</langitemno>
<monthdate>2019-07-01</monthdate>
<automitemno>2131</automitemno>
<amount>0.386750000000</amount>
<currentamount>0.000000000000</currentamount>
<langitemno>1</langitemno>

и так далее. Я хочу, чтобы столбец в #TempTable содержал каждое вхождение данных между тегами <monthdate> и </amount>. Это должно выглядеть так:

XMLValue
---------
2019-07-01</monthdate><automitemno>302</automitemno><amount>1.190000000000
2019-07-01</monthdate><automitemno>2131</automitemno><amount>0.386750000000

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Вот решение, которое дает текст в точности как написано:

declare @xml as nvarchar(max)

set @xml = N'<monthdate>2019-07-01</monthdate>
<automitemno>302</automitemno>
<amount>1.190000000000</amount>
<currentamount>0.000000000000</currentamount>
<langitemno>1</langitemno>
<monthdate>2019-07-01</monthdate>
<automitemno>2131</automitemno>
<amount>0.386750000000</amount>
<currentamount>0.000000000000</currentamount>
<langitemno>1</langitemno>'


select replace(substring(a.value, charindex('<monthdate>',a.value)+11, charindex('</amount>', a.value)-16), char(10), '') as [XMLValue]

from string_split(replace(@xml, '</langitemno>', char(30)), char(30)) a

where a.value like '%<monthdate>%</amount>%'

DBFiddle

0 голосов
/ 01 октября 2019

Я не уверен, какой из них вы имели в виду. Первый возвращает их в виде отдельных строк XML, другой возвращает их в виде строк типизированных данных:

DECLARE @sample TABLE
(
    id INT IDENTITY,
    xmlSnippet VARCHAR(MAX)
);

INSERT @sample
(
    xmlSnippet
)
VALUES
('<monthdate>2019-07-01</monthdate>
<automitemno>302</automitemno>
<amount>1.190000000000</amount>
<currentamount>0.000000000000</currentamount>
<langitemno>1</langitemno>
<monthdate>2019-07-01</monthdate>
<automitemno>2131</automitemno>
<amount>0.386750000000</amount>
<currentamount>0.000000000000</currentamount>
<langitemno>1</langitemno>');


DECLARE @tempTable TABLE
(
    id INT,
    XMLValue XML
);

INSERT @tempTable
(
    id,
    XMLValue
)
SELECT id,
       CAST('<monthdate>' + value AS XML)
FROM @sample
    CROSS APPLY STRING_SPLIT(REPLACE(xmlSnippet, '<monthdate>', '&'), '&')
WHERE value <> '';
SELECT *
FROM @tempTable;

DECLARE @tempTable2 TABLE
(
    monthDate DATE,
    autoItemNo INT,
    amount MONEY,
    currentAmount MONEY
);

WITH myData (id, xmlRow)
AS (SELECT id,
           CAST('<monthdate>' + value AS XML)
    FROM @sample
        CROSS APPLY STRING_SPLIT(REPLACE(xmlSnippet, '<monthdate>', '&'), '&')
    WHERE value <> '')
INSERT @tempTable2
(
    monthDate,
    autoItemNo,
    amount,
    currentAmount
)
SELECT myData.xmlRow.value('/monthdate[1]', 'date'),
       myData.xmlRow.value('/automitemno[1]', 'int'),
       myData.xmlRow.value('/amount[1]', 'money'),
       myData.xmlRow.value('/currentamount[1]', 'money')
FROM myData;

SELECT *
FROM @tempTable2;

РЕДАКТИРОВАТЬ: я добавил DBFiddle demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...