1

我正在尝试更新 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()]: ")" 是预期的。

任何人?

4

2 回答 2

2

你只需要在and里面使用[],像这样:

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

sql fiddle demo

于 2013-10-03T18:19:56.997 回答
0

我遇到了类似@nkstr 的问题。@Roman Pekar 的回答帮助我了解了如何更新属性值、过滤其他属性。这是我使用的 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
于 2013-11-06T22:18:58.273 回答