动态替换XML DML中节点的值

Eon*_*Eon 3 xml t-sql sql-server xquery dml

我现在正在努力解决这个问题:如何替换文本等于某个变量值的无类型XML列中的节点值?可能吗?

我的XML:

<attrs>
  <attr>ManualInsert</attr>
  <attr>ManualInsert2</attr>
  <attr>ManualInsert4</attr>
  <attr>ManualInsert8</attr>
</attrs>
Run Code Online (Sandbox Code Playgroud)

我的尝试:

DECLARE @OldValue Varchar(255) =  'ManualInsert'
DECLARE @NewValue Varchar(255) =  'ReplacedValue'

UPDATE
    Labels
SET
    Attributes.modify('replace value of (/attrs/attr/text())[1]
                       with
                       if ((/attrs/attr/text() = sql:variable("@OldValue")))
                       then sql:variable("@NewValue")
                       else () ')
WHERE
    Id = 2000046
Run Code Online (Sandbox Code Playgroud)

信息: (0 row(s) affected)

DECLARE @OldValue Varchar(255) =  'ManualInsert'
DECLARE @NewValue Varchar(255) =  'ReplacedValue'

UPDATE
    Labels
SET
    Attributes.modify('replace value of (/attrs/attr[text() = sql:variable("@OldValue")])[1]
                       with sql:variable("@NewValue")')
WHERE
    Id = 2000046
Run Code Online (Sandbox Code Playgroud)

信息:

Msg 2356, Level 16, State 1, Line 7
XQuery [Labels.Attributes.modify()]: The target of 'replace value of' must be a non-metadata attribute or an element with simple typed content, found 'element(attr,xdt:untyped) ?'
Run Code Online (Sandbox Code Playgroud)

预期结果:

<attrs>
  <attr>ReplacedValue</attr>
  <attr>ManualInsert2</attr>
  <attr>ManualInsert4</attr>
  <attr>ManualInsert8</attr>
</attrs>
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 8

modify('replace value of (/attrs/attr[. = sql:variable("@OldValue")]/text())[1]
        with sql:variable("@NewValue")')
Run Code Online (Sandbox Code Playgroud)

您的第二次尝试实际上只是缺少指定它应该被替换的text().这也行.

modify('replace value of (/attrs/attr[text() = sql:variable("@OldValue")]/text())[1]
        with sql:variable("@NewValue")')
Run Code Online (Sandbox Code Playgroud)

  • 来自[here](http://msdn.microsoft.com/en-us/library/ms190675.aspx)和[here](http://en.wikipedia.org/wiki/Trial_and_error):). (3认同)