2011-08-16 89 views
1

我試圖更新XML字符串中複雜類型的一部分的元素。 where子句被忽略,字符串的第一個元素是唯一被解開的元素。SQL Server 2008 R2表更新XML列修改忽略where子句

XML架構集合(簡化形式):

<element name="rangeDef"> 
    <complexType> 
     <sequence> 
      <element maxOccurs="unbounded" name="defs"> 
       <complexType> 
        <sequence> 
         <element name="ID" type="string"/> 
         <element name="available" type="string"/> 
        </sequence> 
       </complexType> 
      </element> 
     </sequence> 
    </complexType> 
</element> 

填充字符串爲:

<rangeDef> 
    <defs> 
     <ID>AA</ID> 
     <available>Y</available> 
    </defs> 
    <defs> 
     <ID>AB</ID> 
     <available>Y</available> 
    </defs> 
    <defs> 
     <ID>AC</ID> 
     <available>Y</available> 
    </defs> 
    <defs> 
     <ID>AD</ID> 
     <available>Y</available> 
    </defs> 
    <defs> 
     <ID>AE</ID> 
     <available>Y</available> 
    </defs> 
</rangeDef> 

,這是保存在一個表 - >testDef (key char(10), rangeDef xml)

UPDATE語句:

update testDef 
set rangeDef.modify('replace value of (//defs/available)[1] with "N"') 
where rangeDef.exist ('//defs[ID = sql:variable("@myValue")] = 1 and 
key = @myKey 

@myValue被聲明爲char(2)並設置爲'AD' @myKey是簡單的搜索關鍵字。

隨着(//...)[1]的修改語法,選擇一個節點作爲XML字符串中的第一個節點,並忽略where子句。不知道在語法中需要哪些更正,例如rangeDef.exist將尋找XML字符串的適當元素。我的想法是,我應該使用position()函數,而不是指示[1],但我不清楚它是如何實現的。

回答

0

我想出更新聲明的問題。 where子句必須是修改語句的一部分:

update testDef set rangeDef.modify('replace value of(// defs [ID = sql:variable(「@ myValue」))/ available)[1]與「N」') 其中key = @myKey

1

Where子句過濾要更新的。您需要在replace value of ...中指定要更新的節點。

update testDef set 
    rangeDef.modify('replace value of (//defs[ID = sql:variable("@myValue")]/available/text())[1] 
        with "N"') 
where key = @myKey