【问题标题】:How to modify multiple nodes using SQL XQuery in MS SQL 2005如何在 MS SQL 2005 中使用 SQL XQuery 修改多个节点
【发布时间】:2009-08-05 10:52:30
【问题描述】:

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

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"')

但仅更新了该行中的第一个比利。

多次运行更新:

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>

【问题讨论】:

    标签: sql sql-server xml sql-server-2005 tsql


    【解决方案1】:

    “简单”的方法是将 XML 列转换为 VARCHAR(MAX),然后简单地对其执行替换:

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

    您似乎无法在单个 UPDATE 语句中更新多个 XML 节点值,正如 Richard Szalay 解释的 here

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

    所以我猜你要么必须使用上面提到的“哑” VARCHAR(MAX) 方法,要么在循环中进行更新(当你仍然找到一个带有“billy”的节点时,更新该节点以读取“彼得”代替)。

    马克

    【讨论】:

    • 如果我有类似 那么我可能不想重命名昵称属性。
    • 我正在尝试解决这个问题 - 如果您多次运行更新语句会怎样?它会一一更新行吗?
    • 对于第 1 行:第一次 = 1 第二次 1 第三次 1
    • 所以多次运行更新也可以解决问题 - 不完美,也不是很流畅和整洁,但它可以工作,对吧?
    • 是的,它有效,我将不得不以某种方式使用它.. grr!感谢您的建议!
    【解决方案2】:

    我最终使用光标进行更新

    在while循环中使用光标中marcs答案中的更新

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 2010-11-02
      • 1970-01-01
      • 2011-07-26
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 2021-10-30
      相关资源
      最近更新 更多