我在 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 子句中包含我的第二个条件(PriceLevel=NONFREE),我不知道该怎么做。也许我可以为这样的第二个条件加上一个 AND ......
AND OrderXML.value('(/Order/InternalInformation/InternalOrderBreakout/InternalOrderHeader/InternalOrderDetails/InternalOrderDetail/PriceLevel/node())[1]','nvarchar(64)') = 'NONFREE'
但我担心它最终会像 OR 一样运行,因为它是一个 XML 查询。
一旦我得到正确的 WHERE 子句,我将使用这样的 SET 更新列:
UPDATE Orders SET orderXml.modify('replace value of (/Order/InternalInformation/InternalOrderBreakout/InternalOrderHeader/InternalOrderDetails/InternalOrderDetail/PriceLevel[1]/text())[1] with "NONFREE"')
但是,我在一些测试数据上运行了这个语句,并且没有更新的 XML 列(即使它说 zz 行受到影响)。
我一直在这几个小时无济于事。帮助表示赞赏。谢谢。