前天开发系统时又遇到重复数据的问题,于是将之前收集整理的脚本代码(脚本1)拿出来运行,结果直接蹦出(错误1)。看错误信息,估计是数据量太多。为验证这个想法,我新建一张表,添加2个字段,在输入3条重复的数据,在执行(脚本1),结果命令成功执行。怎么办呢?我推测可能是删除数据量大,花费太多时间的缘故,于是将脚本修改为(脚本2),再运用于新建的表,结果命令成功执行。我满怀欣喜地将(脚本2)运用于我要删除重复数据的那张库表。但是结果让人失望,还是出现(错误2)。经过一番测试,我才知道使用 select into 将新建库表,而(脚本2)中只讲数据删除,库表还是存在,故提示对象已存在。再修改(脚本2),得到(脚本3)。结果竟还是出现(错误3),不过错误已经很明显了,是由于存在自增列的缘故。最后将脚本修改为(脚本4),命令成功执行,OK!!!
脚本1:
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
脚本2:
select distinct * into #Tmp from tableName
delete from tableName
select * into tableName from #Tmp
drop table #Tmp
脚本3:
select distinct [col1, col2, ...] into #Tmp from tableName
delete from tableName
insert into tableName (col1, col2, ....) select * from #Tmp
drop table #Tmp
脚本4:
select distinct * into #Tmp from tableName
delete from tableName
insert into tableName select * from #Tmp
drop table #Tmp
错误1:
服务器: 消息 3724,级别 16,状态 2,行 1
无法 除去 表 'tableName',因为它正用于复制。
错误2:
服务器: 消息 2714,级别 16,状态 6,行 3
数据库中已存在名为 'tableName' 的对象。
错误3:
服务器: 消息 8101,级别 16,状态 1,行 3
仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表 'tableName' 中为标识列指定显式值。