基于xml节点值更新记录中xml的SQL更新查询?
我有一列是ntext数据类型,而不是XML。它存储所有xml数据。我需要更新记录中的xml节点。它抛出一个错误,表示“xml数据类型方法'modify'的使用不正确。在此上下文中应使用非mutator方法。” 示例XML:基于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
<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