如何替换SQL Server中的XML节点属性值 [英] How to replace XML node attribute value in SQL server

查看:94
本文介绍了如何替换SQL Server中的XML节点属性值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用新值更新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/> ;<员工ID =109/>< / ROOT>')
INSERT INTO @Employee VALUES('< ROOT>< Employee Id =111/>< Employee Id = 107/><员工ID =101/>< / ROOT>')

SELECT * FROM @Employee

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

如果EXISTS(SELECT 1 FROM @Employee WHERE empXML.exist('ROOT / Employee [@ Id = sql:variable(@ NewEmployeeId)]')= 1)
BEGIN
UPDATE @Employee
SET empXML.modify('删除ROOT / Employee [@Id eq sql:variable(@ OldEmployeeId)]')
END
ELSE
BEGIN
UPDATE @Employee
SET empXML.modify('替换值(ROOT / Employee [@Id eq sql:variable(@ OldEmployeeId)] / @ Id)[1]与sql:variable (@NewEmployeeId)')
WHERE empXML.exist('ROOT / Employee [@Id eq sql:variable(@ OldEmployeeId)]')= 1;
END

SELECT * FROM @Employee

但它没有按预期工作。请帮助我。

解决方案

如果我已经理解你要做什么,这样的事情应该有效:

 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('删除ROOT / Employee [@Id eq sql:variable(@ OldEmployeeId)]')
WHERE empXML.exist( 'ROOT / Employee [@Id eq sql:variable(@ NewEmployeeId)]')= 1;

UPDATE @Employee
SET empXML.modify('替换值(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  >  <  员工    Id   =  100    /  >  <  员工    Id   =  102    /  >  <   / ROOT  >  
< ROOT > < 员工 Id = 100 / > < 员工 Id = 106 / > < 员工 Id = 107 / > < / ROOT >
< ROOT > < 员工 Id = 100 / > < 员工 Id = 102 / > < 员工 Id = 109 / > < / ROOT >
< ; ROOT > < 员工 Id = 111 / > < 员工 Id = 107 / > < 员工 Id = 100 / > < / ROOT >


I want to update xml node attribute value with new value. based on following condition
Condition 1: If new value already exists in xml row then delete old value node from xml
Condition 2: If new value does not exists in xml row then replace old value with new value.

What I have tried:

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.

解决方案

If I've understood what you're trying to do, something like this should work:

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;


Output:

<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>


这篇关于如何替换SQL Server中的XML节点属性值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆