【问题标题】:Update xml node attributes in SQL Server, filtering on other attribute更新 SQL Server 中的 xml 节点属性,过滤其他属性
【发布时间】:2013-10-03 12:16:49
【问题描述】:

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

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

表:

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”的所有item节点,我需要将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()]: ")" 是预期的。

有人吗?

【问题讨论】:

    标签: sql-server xml sql-server-2008 xquery sqlxml


    【解决方案1】:

    您只需在[] 中使用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

    【讨论】:

      【解决方案2】:

      我遇到了类似@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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-07
        • 1970-01-01
        • 2011-06-02
        • 2021-08-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多