Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 用于更新列中存储的xml节点的sql查询_Sql Server_Xml_Sql Update_Xml Column - Fatal编程技术网

Sql server 用于更新列中存储的xml节点的sql查询

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]

我正在从事一个项目,其中我使用的是一个表,该表的一列中存储有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] 
                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>&lt;testnode&gt;test value&lt;/testnode&gt;</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>&lt;testnode&gt;test value&lt;/testnode&gt;</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种方法:插入、替换值和删除。恐怕没有太多的选择。