如何使用XQuery更改匹配的元素文本?

时间:2009-10-14 17:46:46

标签: sql-server-2005 element xquery

我正在尝试将我看过的所有示例拼凑起来找到元素并修改它们,但我还没有想出一些有用的东西。我在下面创建了一个示例,我在SQL Server 2005中运行。我正在尝试将ItemID 4更改为999:

DECLARE @x XML
SELECT @x = '
<ValueCollection>
  <ItemGroup Name="Group A">
    <ItemID>1</ItemID>
    <ItemID>2</ItemID>
  </ItemGroup>
  <ItemGroup Name="Group B">
    <ItemID>3</ItemID>
    <ItemID>4</ItemID>
  </ItemGroup>
</ValueCollection>
';

SET @x.modify ('
replace value of
    (/ValueCollection/ItemGroup[ItemID="4"]/ItemID/text())[1]
with "999"
')

SELECT @x;

但是发生的事情是ItemID 3变为999而不是4,如下面的结果所示。我认为正在发生的是“/ ItemGroup [ItemID =”4“]正在找到正确的&lt; ItemGroup&gt;,然后位置过滤器[1]在该&lt; ItemGroup&gt;中给出第一个&lt; ItemID&gt;(其中是ID 3) - 我还没有找到如何将位置过滤器更改为变量。

<ValueCollection>
  <ItemGroup Name="Group A">
    <ItemID>1</ItemID>
    <ItemID>2</ItemID>
  </ItemGroup>
  <ItemGroup Name="Group B">
    <ItemID>999</ItemID>
    <ItemID>4</ItemID>
  </ItemGroup>
</ValueCollection>

我感觉这是一件简单的事情,我的谷歌搜索和堆栈溢出还没有出现。感谢您的帮助! 凯文

1 个答案:

答案 0 :(得分:2)

SET @x.modify ('replace value of
    (/ValueCollection/ItemGroup/ItemID[text()=4]/text())[1]
    with "999"
    ')

或者如果你想更精确:

SET @x.modify ('replace value of
    (/ValueCollection/ItemGroup[@Name="Group B"]/ItemID[text()=4]/text())[1]
     with "999"
    ')