小编典典

如何在MS SQL 2005中使用SQL XQuery修改多个节点

sql

在一个表中,我有以下内容。

ParameterID (int)    ParameterValue (XML)
------------    --------------
1               <USER><User ID="1" Name="Billy"/><USER>
                <USER><User ID="2" Name="Billy"/><USER>
                <MANAGER><User ID="1" Name="Billy"/><MANAGER>
2               <USER><User ID="1" Name="John"/><USER>
                <USER><User ID="2" Name="Billy"/><USER>
                <MANAGER><User ID="1" Name="Billy"/><MANAGER>
3               <USER><User ID="1" Name="David"/><USER>
                <USER><User ID="2" Name="Billy"/><USER>
                <MANAGER><User ID="1" Name="Billy"/><MANAGER>

如何将Billy的所有实例都修改为Peter?

我试过了

-- Update the table         
UPDATE  @tbXML
SET     ParameterValue.modify('replace value of (//User/@Name[.="Billy"])[1] with "Peter"')

但是只更新了该行中的第一个Billy。

多次运行更新:

For Row 1: 
1st Time = 1 <USER><User ID="1" Name="Peter"/><USER> <USER><User ID="2" Name="Billy"/><USER> <MANAGER><User ID="1" Name="Billy"/><MANAGER>

2nd Time 1 <USER><User ID="1" Name="Peter"/><USER> <USER><User ID="2" Name="Peter"/><USER> <MANAGER><User ID="1" Name="Billy"/><MANAGER>

3rd Time 1 <USER><User ID="1" Name="Peter"/><USER> <USER><User ID="2" Name="Peter"/><USER> <MANAGER><User ID="1" Name="Peter"/><MANAGER>

阅读 135

收藏
2021-04-14

共1个答案

小编典典

“简单”的方法是将XML列转换为VARCHAR(MAX),而只需对其进行替换:

UPDATE
  YourTable
SET
  ParameterValue = CAST(REPLACE(CAST(ParameterValue AS VARCHAR(MAX)), '
                                Billy', 'Peter') AS XML)
WHERE
  ....

它几乎好像你不能做多个XML节点值的更新在一个UPDATE语句中,理查德·绍洛伊解释在这里

不幸的是,该实现似乎受到了严格的限制,因为它无法在单个更新中对相同的值进行任意数量的修改。

因此,我想您要么必须使用上面提到的“哑” VARCHAR(MAX)方法,要么在循环中进行更新(当您仍然找到带有“ billy”的节点时,请将该节点更新为“
Peter”) )。

马克

2021-04-14