Столбец XML обновления таблицы SQL Server 2008 R2 изменить, игнорируя предложение where - PullRequest
1 голос
/ 17 августа 2011

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

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Предложение 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
0 голосов
/ 17 августа 2011

Я выяснил проблему с заявлением об обновлении. Предложение where должно быть частью оператора изменения:

обновление testDef set rangeDef.modify ('заменить значение (// defs [ID = sql: variable ("@ myValue")] / available) [1] на "N"') где ключ = @ myKey

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...