выберите запрос для удаления узлов из столбца xml - PullRequest
3 голосов
/ 31 мая 2011

У меня есть таблица со столбцом XML, который содержит 2 узла с большими строками base64 (изображения). Когда я запрашиваю базу данных, я хочу удалить эти 2 узла из XML, возвращенного клиенту. Я не могу изменить схему таблицы (т.е. я не могу разделить данные в столбце). Как я могу удалить 2 узла из столбца xml с помощью оператора select? (Узлы для удаления содержат текст «Изображение» в своем названии). В любом отдельном запросе может быть возвращено до 1000 записей.

В настоящее время мой запрос в основном выглядит следующим образом:

select top 1000 [MyXmlData] from [MyTable]

Столбец MyXmlData содержит xml, который выглядит примерно так:

<MyXml>
   <LotsOfNodes></LotsOfNodes>
   ...
   <ANode>
      ...
      <MyImage1></MyImage1>   <!-- remove this from returned xml -->
      <MyImage2></MyImage2>   <!-- remove this from returned xml -->
      ...
   </ANode>
   ...
   <LotsOfNodes></LotsOfNodes>
   ...
</MyXml>

Я использую SQL Server 2008.

1 Ответ

3 голосов
/ 31 мая 2011

Это проверено на SQL Server

Вы можете сохранить результат запроса во временной таблице или табличной переменной и использовать modify () to delete узлы Image. Используйте содержит () и local-name () , чтобы выяснить, должен ли узел быть удален.

declare @T table(XmlData xml)

insert into @T values
('<MyXml>
    <LotsOfNodes></LotsOfNodes>
    <ANode>
      <MyImage1></MyImage1>   <!-- remove this from returned xml -->
      <MyImage2></MyImage2>   <!-- remove this from returned xml -->
    </ANode>
    <LotsOfNodes></LotsOfNodes>
  </MyXml>')

update @T set
  XmlData.modify('delete //*[contains(local-name(.), "Image")]')

select *
from @T

Результат:

<MyXml>
  <LotsOfNodes />
  <ANode>
    <!-- remove this from returned xml -->
    <!-- remove this from returned xml -->
  </ANode>
  <LotsOfNodes />
</MyXml>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...