2011-08-16 1 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 testDef 
set rangeDef.modify('replace value of (//defs/available)[1] with "N"') 
where rangeDef.exist ('//defs[ID = sql:variable("@myValue")] = 1 and 
key = @myKey 

@myValuechar(2)으로 선언되고 'AD'으로 설정됩니다. @myKey은 간단한 검색 키입니다.

(//...)[1]의 수정 구문을 사용하면 XML 문자열의 첫 번째 노드 인 단일 노드가 선택되고 where 절이 무시됩니다. rangeDef.exist가 XML 문자열의 적절한 요소를 찾을 곳과 같은 구문에 어떤 수정이 필요한지 잘 모릅니다. 내 생각에 표시 (1) 대신 position() 함수를 사용해야하지만 구현 방법에 대해서는 명확하지 않습니다.

답변

0

업데이트 문과 관련된 문제를 파악했습니다. where 절은 modify 문의 일부 여야합니다.

업데이트 testDef set rangeDef.modify ('def value [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