更新 SQL Server 中的 xml 节点属性,筛选其他属性



我正在尝试更新XML列中的节点属性,但我卡住了。诚然,直到一天前,XQuery 对我来说还是白噪音,我可以再坚持一些,但这会伤害我的客户。我上下拖曳了这么多,仍然一样卡住了。

因此,以下是我的设置的相关部分:

桌子:

CREATE TABLE Tbl(Id int IDENTITY, XmlCol XML)
INSERT Tbl VALUES(
'<root>
  <item ID="1">some text input</item>
  <item ID="7" PROP="10">1</item>
</root>
'
)
INSERT Tbl VALUES(
'<root>
  <item ID="1">some other text input</item>
  <item ID="8" PROP="10">1</item>
</root>
'
)

上下文?不要问我为什么,它太做作了,你会陷入试图理解它。

对于 ID 属性为"8"的所有项目节点,我需要将 PROP 属性增加 30。完成后,我需要将 ID 属性从"8"更新为"7"以匹配节点,从而有效地合并项目,同时保持它们的 PROP 值分开。

这是我所得到的,但SQL Server(或我)玩得并不好。

更新声明:

DECLARE @newVal INT = 40
update Tbl
set XmlCol.modify('replace value of (/root/item[@ID="8"][@PROP="10"]/@PROP)[1]
                   with sql:variable("@newVal") ')

结果:

XQuery [Tbl.XMLCol.modify()]: ")"是意料之中的。

任何人?

您只需要在[]中使用and,如下所示:

update Tbl set
   XmlCol.modify('
      replace value of (/root/item[@ID="8" and @PROP="10"]/@PROP)[1]
      with sql:variable("@newVal")
   ')

SQL 小提琴演示

我遇到了类似的问题,比如@nkstr。Pekar @Roman的回答帮助我很好地了解了如何更新属性值,过滤其他属性。这是我使用的 SQL。

declare @X xml = 
'<root>
<items>
    <item ItemID="100">
        <obj ObjID="0001" value="val1"/>
        <obj ObjID="0002" value="val2"/>
        <obj ObjID="0003" value="val3"/>
        <obj ObjID="0004" value="val4"/>
    </item>
    <item ItemID="200">
        <obj ObjID="0001" value="val1"/>
        <obj ObjID="0002" value="val2"/>
        <obj ObjID="0003" value="val3"/>
        <obj ObjID="0004" value="val4"/>
    </item>
</items>
</root>'
declare @ITEMID int = 200 
declare @OBJID int = 0004
declare @NEWVAL int = 8888
--update ObjID 0004 at ItemID 200 into 8888 (this is a comment)
set @X.modify('replace value of  (/root/items/item[@ItemID=sql:variable("@ITEMID")]/obj[@ObjID=sql:variable("@OBJID")]/@ObjID)[1] with sql:variable("@NEWVAL")')
select @X

最新更新