我的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")]')
有没有办法做到这一点?
编辑:我现在用光标运行它,但还有另一种方法吗?由于
答案 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)