2011-08-16 85 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