3

運が悪ければ、その属性値を持つすべての要素の属性の値を変更するmodify()ステートメントを作成しようとしています。これまでのところ、最初に一致した要素の値を変更することしかできません。SQL Server 2005で実行している、これまでの例を以下に作成しました。

DECLARE @x XML
SELECT @x = '
<FootballApparel>
  <Item Team="Phoenix Cardinals" Type="Hat" Cost="$14.99" />
  <Item Team="Indianapolis Colts" Type="Hat" Cost="$14.99" />
  <Item Team="Cincinnati Bengals" Type="Hat" Cost="$14.99" />
  <Item Team="Phoenix Cardinals" Type="Shirt" Cost="$21.99" />
  <Item Team="Indianapolis Colts" Type="Shirt" Cost="$21.99" />
  <Item Team="Cincinnati Bengals" Type="Shirt" Cost="$21.99" />
</FootballApparel>
';

SET @x.modify('
  replace value of
    (/FootballApparel/Item[@Team="Phoenix Cardinals"]/@Team)[1]
  with "Arizona Cardinals"
');

SELECT @x;

これを実行すると、以下の結果が得られます。変更されたのは、PhoenixCardinalsの最初のインスタンスのみです。

<FootballApparel>
  <Item Team="Arizona Cardinals" Type="Hat" Cost="$14.99" />
  <Item Team="Indianapolis Colts" Type="Hat" Cost="$14.99" />
  <Item Team="Cincinnati Bengals" Type="Hat" Cost="$14.99" />
  <Item Team="Phoenix Cardinals" Type="Shirt" Cost="$21.99" />
  <Item Team="Indianapolis Colts" Type="Shirt" Cost="$21.99" />
  <Item Team="Cincinnati Bengals" Type="Shirt" Cost="$21.99" />
</FootballApparel>

すべてのインスタンスを置き換える正しいmodify()ステートメントを手伝ってもらえますか?

ありがとう!
ケビン

4

1 に答える 1

5

あなたは非常に近いです-あなたがする必要があるのはループです(そしてこの場合それをするために私が知っている他の方法はありません)そして繰り返し値を置き換えます:

WHILE @x.exist('(/FootballApparel/Item[@Team=sql:variable("@oldTeamName")])[1]') = 1
SET @x.modify('
  replace value of (
    /FootballApparel/Item[@Team=sql:variable("@oldTeamName")]/@Team
  )[1]
  with sql:variable("@newTeamName")
');

それでうまくいくはずです。

マーク

于 2009-10-14T14:48:43.447 に答える