2

ここでスタックオーバーフローに関するいくつかの回答を見てきましたが、探しているものが見つかりません。この質問このページ、および他のいくつかのページを確認しましたが、解決策を見つけることができません。

これは私のテストデータです。実際、このコードはテーブルの XML 列内にあります。

<product id=152>
    <name>tractor</name>
    <category weight=5600 invoice="A600"/>
</product>
<product id=731>
    <name>excavadora</name>
    <category weight=12340 invoice="B300"/>
</product>

必要なのは、次の 2 つのアクションを実行して以前の XML を更新することです。

  • カテゴリ ノードに新しい属性を追加する
  • その新しい属性値を更新できるように、重みを変更しようとしましたが、それを行うことができません

ソリューションは、クエリで .modify および .value キーワードを使用する必要があると思いますが、方法がわかりません。

私はSQL Server 2008 Expressを使用しています。クエリが答えを得るのに役立つことを見てきましたが、実際には何も機能していません。

4

1 に答える 1

0

これは、あなたの状況に固有の例です。ID 152 の重みを値 54321 に置き換えています。

DECLARE
    @x xml,
    @ProductID int,
    @CategoryWeight int

SELECT @x = '
    <Product ID="152"> 
        <Category Weight="5600" Invoice="A600" /> 
    </Product>
    <Product ID="731">
        <Category Weight="12340" Invoice="B300" />        
    </Product>'

SELECT
   @ProductID = 152,
   @CategoryWeight = 54321

SET @x.modify('
    replace value of (
        /Product[@ID=sql:variable("@ProductID")]/Category/@Weight
    )[1]
    with sql:variable("@CategoryWeight")
')

SELECT @x

必要に応じて、sql:variable("") の部分を実際の値に置き換えることができることに注意してください。この例に慣れれば、インサートは簡単なものになるはずです。:) 幸運を!

于 2013-02-11T02:15:18.343 に答える