2011-05-10 77 views
6

我有一列ntext数据类型和NOT XML。它存储所有的XML数据。我需要更新记录中的xml节点。它会抛出一个错误,指出“错误地使用xml数据类型方法'modify'。在此上下文中,预计将使用非增变方法。”SQL更新查询根据xml节点值更新记录中的xml?

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

update table_name 
set column_name = CONVERT(xml,column_name).modify('replace value of (/root/ProductInformation/CPSIA/CpsiaDetails/Item[CpsiaId=sql:variable("@Cps_Id")]/CpsiaMessage/text())[1] with sql:variable("@Cps_Message")') 
WHERE Convert(xml,column_name).exist('/root/ProductInformation/CPSIA/CpsiaDetails/Item[CpsiaId=sql:variable("@Cps_Id")]')=1 

rollback 

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

回答

6

你需要使用修改方法对XML数据类型。

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 

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

+0

它会抛出一个错误“错误地使用xml数据类型方法'modify'。在这种情况下,期望非mutator方法。当我修改为单个更新查询与表和不使用临时表.... – DotNetDeveloper 2011-05-11 02:04:45

+0

如果一个直接更新查询不起作用..你可以发布一些示例为“你可以通过加入更新的临时更新原始表表到键上的原始表“。 – DotNetDeveloper 2011-05-11 02:06:31

+0

我已更新上述代码与您的解决方案,以便我可以得到最近的一个,并感谢您的时间 – DotNetDeveloper 2011-05-11 02:15:20