xpertzgurtej Ответов: 1

Как заменить значение атрибута узла XML в SQL server


Я хочу обновить значение атрибута xml-узла новым значением. исходя из следующего условия
Условие 1: Если новое значение уже существует в строке xml, то удалите старый узел значения из xml
Условие 2: Если новое значение не существует в строке xml, то замените старое значение новым.

Что я уже пробовал:

DECLARE @Employee TABLE(empXML XML); 

INSERT INTO @Employee VALUES('<ROOT><Employee Id="100"/><Employee Id="101"/><Employee Id="102"/></ROOT>')
INSERT INTO @Employee VALUES('<ROOT><Employee Id="100"/><Employee Id="106"/><Employee Id="107"/></ROOT>')
INSERT INTO @Employee VALUES('<ROOT><Employee Id="100"/><Employee Id="102"/><Employee Id="109"/></ROOT>')
INSERT INTO @Employee VALUES('<ROOT><Employee Id="111"/><Employee Id="107"/><Employee Id="101"/></ROOT>')

SELECT * FROM @Employee

DECLARE @OldEmployeeId INT=101, @NewEmployeeId INT=100;

IF EXISTS(SELECT 1 FROM @Employee WHERE empXML.exist('ROOT/Employee[@Id=sql:variable("@NewEmployeeId")]') = 1)
BEGIN
	 UPDATE @Employee 
	 SET empXML.modify('delete ROOT/Employee[@Id eq sql:variable("@OldEmployeeId")]') 
END
ELSE
BEGIN
	UPDATE @Employee
	SET empXML.modify('replace value of (ROOT/Employee[@Id eq sql:variable("@OldEmployeeId")]/@Id)[1] with sql:variable("@NewEmployeeId")')
	WHERE empXML.exist('ROOT/Employee[@Id eq sql:variable("@OldEmployeeId")]') = 1;	
END

SELECT * FROM @Employee

But it is not working as expected.Please help me.

1 Ответов

Рейтинг:
8

Richard Deeming

Если я понял, что вы пытаетесь сделать, что-то вроде этого должно сработать:

DECLARE @Employee TABLE(empXML XML); 

INSERT INTO @Employee VALUES('<ROOT><Employee Id="100"><Employee Id="101"/><Employee Id="102"/></ROOT>');
INSERT INTO @Employee VALUES('<ROOT>>Employee Id="100"/><Employee Id="106"/><Employee Id="107"/></ROOT>');
INSERT INTO @Employee VALUES('<ROOT><Employee Id="100"/><Employee Id="102"/><Employee Id="109"/></ROOT>');
INSERT INTO @Employee VALUES('<ROOT><Employee Id="111"/><Employee Id="107"/><Employee Id="101"/></ROOT>');

SELECT * FROM @Employee;

DECLARE @OldEmployeeId INT=101, @NewEmployeeId INT=100;

UPDATE @Employee 
SET empXML.modify('delete ROOT/Employee[@Id eq sql:variable("@OldEmployeeId")]')
WHERE empXML.exist('ROOT/Employee[@Id eq sql:variable("@NewEmployeeId")]') = 1;

UPDATE @Employee
SET empXML.modify('replace value of (ROOT/Employee[@Id eq sql:variable("@OldEmployeeId")]/@Id)[1] with sql:variable("@NewEmployeeId")')
WHERE empXML.exist('ROOT/Employee[@Id eq sql:variable("@OldEmployeeId")]') = 1;

SELECT * FROM @Employee;

Выход:
<ROOT><Employee Id="100" /><Employee Id="102" /></ROOT>
<ROOT><Employee Id="100" /><Employee Id="106" /><Employee Id="107" /></ROOT>
<ROOT><Employee Id="100" /><Employee Id="102" /><Employee Id="109" /></ROOT>
<ROOT><Employee Id="111" /><Employee Id="107" /><Employee Id="100" /></ROOT>


xpertzgurtej

да...это работает..На самом деле я искал решение с одним оператором обновления. Но нет проблем...Спасибо за вашу помощь