我正在尝试更新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