2013-03-15 2 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

+3

[여기] (http://msdn.microsoft.com/en-us/library/ms190675.aspx) 및 [여기] (http://en.wikipedia.org/wiki/Trial_and_error) :)에서. –

+0

자살 시간. 나는 그것을 어떻게 놓쳤는가?^_^나는 그 페이지 중 하나에있었습니다. 감사합니다. – Eon