如何在 MS SQL 2005 中使用 SQL XQuery 修改多个节点
Posted
技术标签:
【中文标题】如何在 MS SQL 2005 中使用 SQL XQuery 修改多个节点【英文标题】:How to modify multiple nodes using SQL XQuery in MS SQL 2005 【发布时间】: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>
【问题讨论】:
【参考方案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”的节点时,更新该节点以读取“彼得”代替)。
马克
【讨论】:
如果我有类似我最终使用光标进行更新
在while循环中使用光标中marcs答案中的更新
【讨论】:
以上是关于如何在 MS SQL 2005 中使用 SQL XQuery 修改多个节点的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MS Access 2007 或 MS SQL Server 2005 中通过 SQL 将字段转换为行
如何生成将使用数据重建我的 MS SQL Server 2005 数据库的脚本?
如何在 SQL Server 2005 中使用 LIMIT [X] OFFSET [Y] [重复]