2014-01-15 1 views
0

У меня есть столбец XML в моей SQL таблицы, которая содержит что-то вроде этого:Удалить узел из столбца XML с тем, где

<date> 
    <entry action="Log in" insertedTime="2014-01-05T15:05:18.4476032+02:00" /> 
    <entry action="Log in" insertedTime="2014-01-10T16:02:10.8974142+02:00" /> 
    <entry action="Log out" insertedTime="2014-01-11T16:44:54.8380633+02:00" /> 
</date> 

Я пытаюсь очистить этот столбец (у меня есть намного больше, чем 3 записи, 100s), и все, что я хочу сделать, это сохранить последние 2 дня данных, т. е. удалить что-нибудь старше (максимальная дата) - 2 дня.

Я могу получить максимальное время вставки и поместить его в переменную, но, конечно, это максимальное время вставки для всех строк в таблице, я хочу сделать это по принципу «за строку». То есть удалите последние 2 дня даты из каждой строки. Максимальное значение даты для каждой строки может отличаться.

Функция удаления я использую (в настоящее время с использованием временной таблицы для тестирования):

update #xmltemp 
set data.modify('delete //entry[@insertedTime < sql:variable("@maxDate")]') 

Есть ли способ сделать это?

РЕДАКТИРОВАТЬ: У меня теперь работает курсор, но есть ли другой способ сделать это?

Благодаря

+0

Не было бы проще использовать Java или какой-либо другой язык программирования для извлечения, обработки записи и обновления обратно? – IndoKnight

+0

У меня он работает с курсором, но предпочитает делать это без него. Я должен предоставить сценарий клиенту, и он не был бы счастлив запускать приложение (настройка соединения с DB и т. Д.). – Richard

ответ

1

Рисунок из максимального значения даты и времени для каждой строки в таблице в скрещивании применять и использовать sql:column в предиката удаления.

update X 
set data.modify('delete /date/entry[@insertedTime < sql:column("M.I")]') 
from xmltemp as X 
    cross apply (
       select dateadd(day, -2, max(E.X.value('@insertedTime', 'datetime'))) 
       from X.data.nodes('/date/entry') as E(X) 
      ) as M(I) 

SQL Fiddle

+1

Отлично! Большое спасибо за эту помощь, у меня были слезы в использовании курсора ... – Richard

Смежные вопросы