从XML列中删除节点

时间:2014-01-15 09:17:13

标签: sql sql-server xml sql-update

我的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个条目,100个),我想要做的就是保留最近2天的数据,即删除任何早于(最大日期)的内容 - 2天。

我可以获得最大插入时间并将其放入变量中,但当然这是表中所有行的最大插入时间,我想在“每行”的基础上执行此操作。即从每行删除最后2天的日期。每行的最大日期值可能不同。

我正在使用的删除是(目前使用临时表进行测试):

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

有没有办法做到这一点?

编辑:我现在用光标运行它,但还有另一种方法吗?

由于

1 个答案:

答案 0 :(得分: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