簡體   English   中英

更新SQL Server中的xml節點屬性,過濾其他屬性

[英]Update xml node attributes in SQL Server, filtering on other attribute

我正在嘗試更新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的類似問題。 @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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM