2

我正在尝试将我所见过的所有示例拼凑起来以查找元素并修改它们,但我还没有想出一些可行的方法。我在下面创建了一个我目前在 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"] 正在定位正确的 <ItemGroup>,然后位置过滤器 [1] 给出了该 <ItemGroup> 中的第一个 <ItemID>(即 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>

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

4

1 回答 1

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"
    ')
于 2009-10-14T17:50:48.250 回答