有一个存储过程,无法查找出原因,还请大侠们帮看看:
1.存在一个表ANSWERLOG_test,这个表记录了所有的记录,表的结构为以ID(自增)为主键,保存回复的记录,有一列为提交回复的时期
2.按表里的记录的日期把表分成对应月份的表,比如2008年9月的记录生成一个表,生成的表名为ANSWERLOG_test200809(表里的日期为varchar类型)
3.生成的表是从当月的上一个月开始的,每个月都生成一个表 
4.生成了一个表后就把原来的ANSWERLOG_test表中的相应记录删除掉.比如生成了ANSWERLOG_test200809这个新表后就把原表中2008年9月的内容删除,这样原来的表只记录着当月的记录 
5.用存储过程实现. 
以下是我写的存储过程:
CREATE   procedure fff as
declare @ncount int--计算除了本月外的记录行数
declare @insesql varchar(200)--插入语句
declare @delsql varchar(200)--删除语句
declare @compasql varchar(20)--当月日期的年月,如2008-12
declare @suffixdate varchar(10)--生成新表的后缀
set @insesql=''
set @delsql=''
select @compasql=convert(varchar,year(getdate()))+'-'+convert(varchar,month(getdate()))
select @ncount=count(*) from ANSWERLOG_test where not exists(select vote_time from ANSWERLOG_test where vote_time like '@compasql*')
while(@ncount>0)
begin
select top 1 @suffixdate=substring(ANSWERLOG_test.vote_time,1,4)+substring(ANSWERLOG_test.vote_time,6,2) from ANSWERLOG_test where not exists(select 
vote_time from ANSWERLOG_test where vote_time like '@compasql*')
set @insesql='select * into ANSWERLOG_test'+@suffixdate+' from ANSWERLOG_test where vote_time like '''+@suffixdate+''''
set @delsql='delete from ANSWERLOG_test where vote_time like '''+@suffixdate+''''
exec(@insesql)
exec(@delsql)
select @ncount=count(*) from ANSWERLOG_test where not exists(select vote_time from ANSWERLOG_test where vote_time like '@compasql*') 
end
GO
现在的问题就出在只有新的第一个表能建立起来,但是为空,然后报错:数据库中已存在名为 'ANSWERLOG_test200709' 的对象。(测试的表的数据的最近一个月是2007年9月)

解决方案 »

  1.   

    创建之前判断一下.如果存在则删除.if object_id('db..ANSWERLOG_test200709') is not null
       drop table ANSWERLOG_test200709
      

  2.   

    内容删掉是不行的需要先dropexec(' if object_id(''ANSWERLOG'') is not null drop table ANSWERLOG')
      

  3.   

    在你每次要生成前判断,使用动态SQL.
    例如
    declare @tb as varchar(20)
    set @tb = 'ANSWERLOG_test200709'exec('if object_id(''db..' + @tb + ''') is not null drop table ' + @tb + '')
      

  4.   

    [code=SQL]set @insesql='select * into ANSWERLOG_test'+@suffixdate+' from ANSWERLOG_test where vote_time like '''+@suffixdate+'''' 
    set @delsql='delete from ANSWERLOG_test where vote_time like '''+@suffixdate+''''--这两句like 后未加通配符,未找到任何记录,所以存的表为空.也未删除任何记录,造成第二重循环时,@suffixdate值未改变,故造成表名重复.--加上通配符应该就可以了
    [/code]
      

  5.   

    你这个建的可是基本表啊,在新建之前exec('if object_id(''db..' + @tb + ''') is not null drop table ' + @tb + '')
      

  6.   

    先判断是否存在,如果存在就drop掉。http://sun.51zhuanzhuan.com