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
@myValue
은 char(2)
으로 선언되고 'AD'
으로 설정됩니다. @myKey
은 간단한 검색 키입니다.
(//...)[1]의 수정 구문을 사용하면 XML 문자열의 첫 번째 노드 인 단일 노드가 선택되고 where 절이 무시됩니다. rangeDef.exist가 XML 문자열의 적절한 요소를 찾을 곳과 같은 구문에 어떤 수정이 필요한지 잘 모릅니다. 내 생각에 표시 (1) 대신 position() 함수를 사용해야하지만 구현 방법에 대해서는 명확하지 않습니다.