I have written a query to read the data from Table1 table , in that table there are 2 columns which has xml values, so I need to change one of the xml element value with the new value (it doesn’t matter what value is already present)
My query:-
SELECT [StatusCode]
,MethodDetail
,[ExtendedData]
,[PostMarkDate]
,[Amount]
FROM [dbo].[Table1]
FOR XML RAW('PaymentRecord'), ELEMENTS, TYPE, ROOT('Payments')
My current result :-
ACVJPMORGAN CHASE BANK0187671Bank12345677648.1000
Here I need change the PolicyNumber element value to my own value like '76576566' - I will not be knowing what value present in the table - but I know new value which needs to be changed.
DECLARE @tbl TABLE
(
[StatusCode] VARCHAR(10),
[MethodDetail] XML,
[ExtendedData] XML,
[PostMarkDate] DATE,
[Amount] DECIMAL
);
INSERT INTO @tbl ([StatusCode],[MethodDetail],[ExtendedData],[PostMarkDate],[Amount]) values
('ACV',
N'JPMORGAN CHASE BANK0187671',
N'Bank12345677',
'',
'648.1000');
DECLARE @PolicyNumber VARCHAR(20) = '76576566';
DECLARE @outXML XML = (
SELECT [StatusCode]
,MethodDetail
,[ExtendedData]
,[PostMarkDate]
,[Amount]
FROM @tbl
FOR XML RAW('PaymentRecord'), ELEMENTS, TYPE, ROOT('Payments'));
SET @outXML.modify('replace value of (/Payments/PaymentRecord/ExtendedData/Extra/PolicyNumber/text())[1] with sql:variable("@PolicyNumber")');
-- test
SELECT @outXML;
SQL #2
SELECT [StatusCode]
,MethodDetail
,ExtendedData.query('{
for $e in /Extra/*
return if (local-name($e)="PolicyNumber")
then {sql:variable("@PolicyNumber")}
else $e
}')
,[PostMarkDate]
,[Amount]
FROM @tbl
FOR XML RAW('PaymentRecord'), ELEMENTS, TYPE, ROOT('Payments');
Rajanikant HawaldarPosted Sep 29, 2022, 12:44 PM
SQL # 1
SQL #2