将数据类型varchar转换为bigint时出错

时间:2013-02-14 14:22:22

标签: sql sql-server tsql

我有一个包含数据的表,其中一列包含一个存储为文本的数字。 当应用程序更新它时,它会在数字后面写入_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.

所以没有删除行,一切都没问题,没有错误,但有了它,我得到了这个错误。 我检查了数据,应该没有任何问题。

这里发生了什么?

2 个答案:

答案 0 :(得分:2)

试试这个:

SELECT  v.ID
        , v.sitenummer
        , ROW_NUMBER() OVER (PARTITION BY LEFT(v.sitenummer, PATINDEX('%_BAK%', v.sitenummer) - 1) ORDER BY v.id DESC) num
INTO    #temp
FROM    vdfkraan v
WHERE   PATINDEX('%_BAK%', v.sitenummer) > 0

DELETE  vdfkraan
FROM    #temp t
JOIN    vdfkraan v ON v.id = t.id
AND     t.num <> 1

SELECT  *
FROM    vdfkraan

这是 SQL Fiddle

答案 1 :(得分:0)

我认为您可以使用分组而不是窗口功能:

SELECT  max(id), max(sitenummer)
FROM    vdfkraan
group by left(sitenummer,charindex('_BAK',sitenummer));