データを含むテーブルがあり、列の1つにテキストとして格納されている数値が含まれています。アプリケーションがそれを更新すると、_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
には、1つの列を持つ1つのレコードが含まれていますid = 28376
。
だから、それは私が望むようにうまくいくようです。
次に、選択行にコメントを付け、削除行のコメントを解除します。
今、私は次のエラーを受け取ります:
Msg 8114, Level 16, State 5, Line 2
Error converting data type varchar to bigint.
したがって、削除行がなければ、すべて問題なく、エラーはありませんが、削除行があると、このエラーが発生します。データを確認しましたが、問題ないはずです。
ここで何が起こっているのですか?