Я пытаюсь обновить элемент, являющийся частью сложного типа, в строке 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.Я думаю, что мне следует использовать функцию position () вместо указания [1], но я не совсем понимаю, как это реализовать.