Я не уверен, какой из них вы имели в виду. Первый возвращает их в виде отдельных строк 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