Sql server 用于更新列中存储的xml节点的sql查询
我正在从事一个项目,其中我使用的是一个表,该表的一列中存储有xml数据。我试图根据xml_id和xml节点的位置更新我的整个xml节点,但我无法这样做。我尝试了以下查询,但它只更新xml节点的值,而不是节点的整个键/值 表结构 用于更新xml节点值的查询Sql server 用于更新列中存储的xml节点的sql查询,sql-server,xml,sql-update,xml-column,Sql Server,Xml,Sql Update,Xml Column,我正在从事一个项目,其中我使用的是一个表,该表的一列中存储有xml数据。我试图根据xml_id和xml节点的位置更新我的整个xml节点,但我无法这样做。我尝试了以下查询,但它只更新xml节点的值,而不是节点的整个键/值 表结构 用于更新xml节点值的查询 update tblCCBT_Step_Page_Text_Xml set Xml_XmlData.modify('replace value of (/page/*[position()=1]/text())[1]
update tblCCBT_Step_Page_Text_Xml
set Xml_XmlData.modify('replace value of (/page/*[position()=1]/text())[1]
with "test value"')where xml_id = 101
所以现在我尝试了以下查询来更新整个内部节点
update tblCCBT_Step_Page_Text_Xml
set Xml_XmlData.modify('replace value of (/page/*[position()=1]/text())[1]
with "<testnode>test value</testnode>"') where xml_id = 101
但我在尝试这样做时出错了
Msg 9306,16级,状态1,第2行
XQuery[tblCCBT_Step_Page_Text_Xml.Xml_XmlData.modify]:“replace value of”的目标不能是联合类型,找到“element*,xdt:untyped | comment | processing instruction | Text?”
这是我存储在列中的xml
<page name="page0" identifier="ff-102-101-101">
<backBut>test value</backBut>
<printBut>Print</printBut>
<quiz1>Click on the circle that best describes your</quiz1>
<quiz2>Continue</quiz2>
<quiz3>Finish</quiz3>
<quiz4>You are now on questions </quiz4>
<quiz5>out of</quiz5>
<quiz6>Please answer each question before continuing.</quiz6>
</page>
现在,在上面的xml中,我试图替换-
<backBut>test value</backBut> with <testnode>test value</testnode>
请建议如何实现这一目标。谢谢您可以使用插入/删除方法 您的代码没有在SQL2008R2上为我抛出任何错误。 但也没有达到预期的效果 该语句导致替换节点的文本值,而不是替换节点本身,如下所示
<page name="page0" identifier="ff-102-101-101">
<backBut><testnode>test value</testnode></backBut>
<printBut>Print</printBut>
<quiz1>Click on the circle that best describes your</quiz1>
<quiz2>Continue</quiz2>
<quiz3>Finish</quiz3>
<quiz4>You are now on questions </quiz4>
<quiz5>out of</quiz5>
<quiz6>Please answer each question before continuing.</quiz6>
</page>
您可以使用插入/删除方法 您的代码没有在SQL2008R2上为我抛出任何错误。 但也没有达到预期的效果 该语句导致替换节点的文本值,而不是替换节点本身,如下所示
<page name="page0" identifier="ff-102-101-101">
<backBut><testnode>test value</testnode></backBut>
<printBut>Print</printBut>
<quiz1>Click on the circle that best describes your</quiz1>
<quiz2>Continue</quiz2>
<quiz3>Finish</quiz3>
<quiz4>You are now on questions </quiz4>
<quiz5>out of</quiz5>
<quiz6>Please answer each question before continuing.</quiz6>
</page>
真不敢相信我做到了:
declare @t table (
Id int,
XMLData xml
);
insert into @t (Id, XMLData)
values
(101, N'<page name="page0" identifier="ff-102-101-101">
<backBut>test value</backBut>
<printBut>Print</printBut>
<quiz1>Click on the circle that best describes your</quiz1>
<quiz2>Continue</quiz2>
<quiz3>Finish</quiz3>
<quiz4>You are now on questions </quiz4>
<quiz5>out of</quiz5>
<quiz6>Please answer each question before continuing.</quiz6>
</page>');
-- Before modification
select * from @t;
update t set XMLData = nt.ModXML
from @t t
inner join (
select t2.Id, t2.XMLData.query('
element page {
/page/@*,
for $n in /page/*
return
if (local-name($n) = "backBut") then
<testnode>test value</testnode>
else
$n
}') as [ModXML]
from @t t2
) nt on t.Id = nt.Id
where t.Id = 101;
-- After modification
select * from @t;
正如您所看到的,严格来说,这不是一个XML更新——我正在替换整个XML字段的内容。此外,如果结构更复杂,它可能会停止工作。而且,性能也可能是一个问题。简直不敢相信我做到了:
declare @t table (
Id int,
XMLData xml
);
insert into @t (Id, XMLData)
values
(101, N'<page name="page0" identifier="ff-102-101-101">
<backBut>test value</backBut>
<printBut>Print</printBut>
<quiz1>Click on the circle that best describes your</quiz1>
<quiz2>Continue</quiz2>
<quiz3>Finish</quiz3>
<quiz4>You are now on questions </quiz4>
<quiz5>out of</quiz5>
<quiz6>Please answer each question before continuing.</quiz6>
</page>');
-- Before modification
select * from @t;
update t set XMLData = nt.ModXML
from @t t
inner join (
select t2.Id, t2.XMLData.query('
element page {
/page/@*,
for $n in /page/*
return
if (local-name($n) = "backBut") then
<testnode>test value</testnode>
else
$n
}') as [ModXML]
from @t t2
) nt on t.Id = nt.Id
where t.Id = 101;
-- After modification
select * from @t;
正如您所看到的,严格来说,这不是一个XML更新——我正在替换整个XML字段的内容。此外,如果结构更复杂,它可能会停止工作。而且,性能也可能是一个问题。thanx回答。您的意思是说我们不能在一个查询中执行编辑节点操作,所以如何在特定位置(如1,2 etcI)插入我对SQL中的xml操作不是很熟悉,我只是不知道。只是看了一下你的代码,发现了什么地方出了问题,并为你提供了一个可能的解决方案。我读过关于更新节点内的值、添加和删除节点的内容,但没有看到任何将一个节点替换为另一个节点的内容。好的,但是thanx对于您的工作,如果找不到单个查询,则肯定会与您的解决方案一起使用XML DML只有3种方法:插入、替换值和删除。恐怕没有太多的选项。thanx用于回复。您的意思是说我们不能在单个查询中执行编辑节点操作。因此,如何在特定位置(如1,2 etcI)插入,我不太熟悉SQL中的xml操作,我只是不知道。只是看了一下你的代码,发现了什么地方出了问题,并为你提供了一个可能的解决方案。我读过关于更新节点内的值、添加和删除节点的内容,但没有看到任何将一个节点替换为另一个节点的内容。好的,但是thanx对于您的工作,如果找不到单个查询,则肯定会与您的解决方案一起使用XML DML只有3种方法:插入、替换值和删除。恐怕没有太多的选择。