Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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
基于xml节点值更新记录中xml的SQL更新查询?_Sql_Xml - Fatal编程技术网

基于xml节点值更新记录中xml的SQL更新查询?

基于xml节点值更新记录中xml的SQL更新查询?,sql,xml,Sql,Xml,我有一列是ntext数据类型,而不是XML。它存储所有xml数据。我需要更新记录中的xml节点。它抛出一个错误,表示“xml数据类型方法'modify'的使用不正确。在此上下文中应使用非mutator方法。” 示例XML: <root> <ProductInformation> <Name> Truck with Battery Charger</Name> <Description>Fr.</Descript

我有一列是ntext数据类型,而不是XML。它存储所有xml数据。我需要更新记录中的xml节点。它抛出一个错误,表示“xml数据类型方法'modify'的使用不正确。在此上下文中应使用非mutator方法。”

示例XML:

<root>
  <ProductInformation>
    <Name> Truck with Battery Charger</Name>
    <Description>Fr.</Description>
    <CPSIA>
      <CpsiaDetails>
        <Item>
          <CpsiaId>456</CpsiaId>
          <CpsiaMessage>waring</CpsiaMessage>
        </Item>
        <Item>
          <CpsiaId>236</CpsiaId>
          <CpsiaMessage>to health</CpsiaMessage>
        </Item>
      </CpsiaDetails>
    </CPSIA>
  </ProductInformation>
</root>

带电池充电器的卡车
Fr。
456
威林
236
健康

您需要对XML数据类型使用modify方法

begin transaction
declare @Cps_Id int;
set @Cps_Id = 236;
declare @Cps_Message nvarchar(1024);
set @Cps_Message = 'updating cpsia message with smoking'; 

select id, CONVERT(xml,[text]) txt into #tmp from SO5954359

select * from #tmp

update #tmp
set txt.modify('replace value of (/root/ProductInformation/CPSIA/CpsiaDetails/Item[CpsiaId=sql:variable("@Cps_Id")]/CpsiaMessage/text())[1] with sql:variable("@Cps_Message")') 

select * from #tmp

drop table #tmp
rollback 

然后,您可以通过将已更新的临时表连接到键上的原始表来更新原始表。

它会引发一个错误“不正确使用xml数据类型方法‘modify’。在此上下文中,应使用非mutator方法。”当我修改为使用表进行单次更新查询而不使用临时表时…如果一个直接更新查询不起作用..您能否发布一些示例,说明“您可以通过将更新的临时表连接到键上的原始表来更新原始表。”我已经用你的解决方案更新了上面的代码,这样我可以得到最近的一个,谢谢你的帮助time@user594014:从哪里开始。。。?1.错误:您正在使用标准更新语法(即
updateset=
)。这是不正确的。正确的语法只是
updateset.modify(…)
2。如果数据存储在
xml
类型化列中,则只需进行一次更新即可。由于您有一个NVARCHAR列,您需要运行第二次更新(例如,
updateset=convert(NVARCHAR(1024))。从内部连接开始。=.
您能帮我完成以下操作吗:
begin transaction
declare @Cps_Id int;
set @Cps_Id = 236;
declare @Cps_Message nvarchar(1024);
set @Cps_Message = 'updating cpsia message with smoking'; 

select id, CONVERT(xml,[text]) txt into #tmp from SO5954359

select * from #tmp

update #tmp
set txt.modify('replace value of (/root/ProductInformation/CPSIA/CpsiaDetails/Item[CpsiaId=sql:variable("@Cps_Id")]/CpsiaMessage/text())[1] with sql:variable("@Cps_Message")') 

select * from #tmp

drop table #tmp
rollback