2013-03-15 60 views
3

我現在正在努力解決這個問題:如何替換無類型XML列中節點的值,其中文本等於某個變量值?可能嗎?動態替換XML DML中節點的值

我的XML:

<attrs> 
    <attr>ManualInsert</attr> 
    <attr>ManualInsert2</attr> 
    <attr>ManualInsert4</attr> 
    <attr>ManualInsert8</attr> 
</attrs> 

我嘗試次數:

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 

消息:(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 

消息:

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) ?' 

預期的結果:

<attrs> 
    <attr>ReplacedValue</attr> 
    <attr>ManualInsert2</attr> 
    <attr>ManualInsert4</attr> 
    <attr>ManualInsert8</attr> 
</attrs> 

回答

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

你的第二次嘗試實際上只是缺少指定它是文本()應該被替換。這也會起作用。

modify('replace value of (/attrs/attr[text() = sql:variable("@OldValue")]/text())[1] 
     with sql:variable("@NewValue")') 
+0

徹底的驚人。你在哪裏學習這些東西? – Eon 2013-03-15 15:10:08

+3

從[這裏](http://msdn.microsoft.com/en-us/library/ms190675.aspx)和[這裏](http://en.wikipedia.org/wiki/Trial_and_error):)。 – 2013-03-15 15:12:58

+0

自殺時間。我怎麼錯過了?^_ ^我在其中一頁上。 謝謝 – Eon 2013-03-15 15:20:24