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 が 4 ではなく 999 に変更されています。"/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"
    ')

or if you want to be more precise:

SET @x.modify ('replace value of
    (/ValueCollection/ItemGroup[@Name="Group B"]/ItemID[text()=4]/text())[1]
     with "999"
    ')
于 2009-10-14T17:50:48.250 に答える