作了一个上网日志记录系统,要求保留80天的记录,由于数据量过大,采取了按日期建表的方式存储,如
20070301
20070302
。。
类似这样的表
现在的问题是,我如何删除早于当前日期80天建立的表呢,我写了一个存储过程,只能是每天删除,隔天就删不掉了
如下
declare @tbname  varchar(1000)
declare @sql  varchar(1000)
set @tbname=convert(varchar(12),DateAdd(dd, -60, getdate()),112)
set @sql='drop table dbo.['+@tbname+']'
if exists(select 1 from sysobjects where Name=@tbname and xtype='U')
begin
exec (@sql)
end
请问如何删除所有早于当前时间建立的表呢,只能在表名上作文章了,因为还有其它的表是不需要删除的,如USERINFO等等

解决方案 »

  1.   

    建 个job每天执行一次.
    然后得到现在的日期.
    再判断..删之前的.
      

  2.   

    CREATE TABLE [20050304] (id int)
    CREATE TABLE [20080304] (id int)
    GO
    SELECT Name FROM Sysobjects WHERE xtype='U'
    SELECT name ,id=IDENTITY(INT) INTO # FROM sysobjects WHERE xtype='U'
    GO
    DECLARE @i INT,@cnt INT,@name VARCHAR(100)
    SELECT @i=0,@cnt=@@ROWCOUNT
    WHILE @i<=@cnt
    BEGIN
    SET @i=@i+1
    SELECT @name=name FROM # WHERE id=@i
    IF ISDATE(@name)=1
    BEGIN
    IF DATEDIFF(dd,@name,GETDATE())>0
    EXEC('DROP TABLE [' + @name + ']')
    END



    END
    GODROP TABLE #
    GOSELECT Name FROM Sysobjects WHERE xtype='U'
    GO
      

  3.   


    WHILE @i<=@cnt改为
    WHILE @i<@cnt
      

  4.   

    create table [20080101](id int,name varchar(10))
    create table [20080102](id int,name varchar(10))
    create table [20080103](id int,name varchar(10))declare @sql varchar(8000)
    select @sql=isnull(@sql+' drop table ','')+'['+name+']' 
    from (select name from sysobjects where type='u' and isdate(name)=1) 
    tp where name>'2008-01-01'
    exec('drop table '+ @sql)
      

  5.   

    sp_msforeachtable 'if isdate(parsename(''?'',1))=1  and datediff(day,parsename(''?'',1),getdate())>80 drop table ?'