SQL Server - столбцы типа xml - XML ​​DML - PullRequest
0 голосов
/ 12 декабря 2011

Я хочу удалить некоторые узлы из меню xml, которое хранится в типизированном столбце xml в базе данных.
Фрагмент из меню xml -

<menu xmlns="http://xxx" ..>
<menuItem name="Menu1">
    <menuItem name="SubMenu1">
        <role>role1</role>
        <url target="webPage1.aspx" />
    </menuItem> 
</menuItem> 

Я пытаюсь удалить <role> в menuItem = "SubMenu1", используя следующий XML DML -

UPDATE [dbo].[MenuTest]
SET xmlMenu.modify('
    declare namespace ns="http://xxx";
    delete(/ns:menu/ns:menuItem[@name="Menu1"]/ns:menuItem[@name="SubMenu1"]/ns:role[1])
')

Но получаю эту ошибку:

Сообщение 6965, Уровень 16, Состояние 1, Строка 1
Проверка XML: недопустимое содержимое. Ожидаемый элемент (ы): http://xxx:role, где был указан элемент 'http://xxx:url'.

Подскажите, пожалуйста, что мне здесь не хватает.

Спасибо!

1 Ответ

1 голос
/ 12 декабря 2011

Похоже, ваш XML-столбец подключен к XML-схеме, которой требуется узел <role> перед узлом <url>.

То, что вы разместили здесь, работает просто отлично.

declare @T table 
(
  xmlMenu xml
)

insert into @T values
('<menu xmlns="http://xxx">
     <menuItem name="Menu1">
       <menuItem name="SubMenu1">
         <role>role1</role>
         <url target="webPage1.aspx" />
       </menuItem> 
    </menuItem>
  </menu>')


UPDATE @T
SET xmlMenu.modify('
    declare namespace ns="http://xxx";
    delete(/ns:menu/ns:menuItem[@name="Menu1"]/ns:menuItem[@name="SubMenu1"]/ns:role[1])
')

Результат

<menu xmlns="http://xxx">
  <menuItem name="Menu1">
    <menuItem name="SubMenu1">
      <url target="webPage1.aspx" />
    </menuItem>
  </menuItem>
</menu>
...