我有一个包含数据的表,其中一列包含一个存储为文本的数字。当应用程序更新它时,它会_BAK
在数字后面写入 + 日期时间戳。
我现在正试图通过删除_BAK
数字列中不能删除最新记录的所有记录来清理数据库。
id sitenummer
28376 1441_BAK20130213151952032
28377 1441_BAK20130214142314705
在这种情况下,ID 为 28376 的行是最旧的,必须删除。
我创建了一个应该这样做的查询:
;with sel1 AS (
select t1.ID,t1.sitenummer, CONVERT(BIGint,SUBSTRING(t1.sitenummer,CHARINDEX('_',t1.sitenummer,0)+4,50)) as Stamp1
from vdfkraan as t1
where t1.sitenummer like '%_BAK%' and (SELECT COUNT(SUBSTRING(t2.sitenummer,0,CHARINDEX('_',t2.sitenummer,0))) FROM vdfkraan as t2
where SUBSTRING(t1.sitenummer,0,CHARINDEX('_',t1.sitenummer,0))=SUBSTRING(t2.sitenummer,0,CHARINDEX('_',t2.sitenummer,0))) > 1
group by t1.id,t1.sitenummer)
, sel2 AS (
select t3.id, t3.sitenummer, t3.stamp1,
(select TOP(1) t4.stamp1 from sel1 as t4
WHERE SUBSTRING(t4.sitenummer,0,CHARINDEX('_',t4.sitenummer,0)) =SUBSTRING(t3.sitenummer,0,CHARINDEX('_',t3.sitenummer,0))
order by t3.Stamp1 DESC) AS stamp2 from sel1 as t3)
, sel3 AS (select id from sel2 where Stamp1=stamp2)
--delete FROM vdfkraan
--where id IN (SELECT t1.id FROM sel3 as t1)
--select * from sel2
如果我取消注释最后一行(从 sel2 中选择 *),它会生成下表:
id sitenummer stamp1 stamp2
28376 1441_BAK20130213151952032 20130213151952032 20130213151952032
28377 1441_BAK20130214142314705 20130214142314705 20130213151952032
表sel3
包含一列的一条记录id = 28376
。
所以这似乎就像我想要的那样工作。
现在我注释选择行并取消注释删除行。
现在我收到以下错误:
Msg 8114, Level 16, State 5, Line 2
Error converting data type varchar to bigint.
所以没有删除行,一切都很好,没有错误,但是有了它,我得到了这个错误。我查了资料,应该没有问题。
这里发生了什么?