Orders テーブルに OrderXML という xml 列があります... テーブル
にはこのような XML XPath があります...
/Order/InternalInformation/InternalOrderBreakout/InternalOrderHeader/InternalOrderDetails/InternalOrderDetail
InternalOrderDetails には、このような多くの InternalOrderDetail ノードが含まれています...
<InternalOrderDetails>
<InternalOrderDetail>
<Item_Number>FBL11REFBK</Item_Number>
<CountOfNumber>10</CountOfNumber>
<PriceLevel>FREE</PriceLevel>
</InternalOrderDetail>
<InternalOrderDetail>
<Item_Number>FCL13COTRGUID</Item_Number>
<CountOfNumber>2</CountOfNumber>
<PriceLevel>NONFREE</PriceLevel>
</InternalOrderDetail>
</InternalOrderDetails>
最終目標は、ノードの Item_Number に COTRGUID ('%COTRGUID' など) と PriceLevel=NONFREE が含まれている場合、OrderXML 列の XML を変更することです。その条件が満たされている場合は、PriceLevel 列を FREE に変更したいと考えています。
正しいノードを見つける xpath 式の作成 (OrderXML.value または OrderXML.exist 関数を使用) と、OrderXML.modify 関数を使用した XML の更新の両方に問題があります。
where句について次のことを試しました:
WHERE OrderXML.value('(/Order/InternalInformation/InternalOrderBreakout/InternalOrderHeader/InternalOrderDetails/InternalOrderDetail/Item_Number/node())[1]','nvarchar(64)') like '%13COTRGUID'
それは機能しますが、同じwhere句に2番目の条件(PriceLevel = NONFREE)も含める必要があるように思われ、その方法がわかりません。おそらく、このように 2 番目の条件に AND を入れることができます...
AND OrderXML.value('(/Order/InternalInformation/InternalOrderBreakout/InternalOrderHeader/InternalOrderDetails/InternalOrderDetail/PriceLevel/node())[1]','nvarchar(64)') = 'NONFREE'
しかし、これは XML クエリであるため、最終的に OR のように動作するのではないかと心配しています。
WHERE 句を正しく取得したら、次のように SET を使用して列を更新します。
UPDATE Orders SET orderXml.modify('replace value of (/Order/InternalInformation/InternalOrderBreakout/InternalOrderHeader/InternalOrderDetails/InternalOrderDetail/PriceLevel[1]/text())[1] with "NONFREE"')
ただし、いくつかのテスト データに対してこのステートメントを実行しましたが、更新された XML 列はありませんでした (zz 行が影響を受けたと述べていましたが)。
私はこれで数時間無駄になりました。助けていただければ幸いです。ありがとう。