创建一个存储过程参数为 开始时间和结束时间
功能: 要求删除在给定的时间内 包含的表内的所有数据
CREATE PROCEDURE  cleartb @starttime datetime,@endtime datetime as
 
begin
  declare @sql nvarchar(1000)
  declare @tablename nvarchar(100)
  --删除在时间段内表内的数据
  set @sql=N'delete from ’+@tablename+‘ where start_datetime between '''+CONVERT(char(19), @starttime, 20) +N''' and '' '+CONVERT(CHAR(19), @endtime, 20) +N''''
    --添加括号 没有括号执行存储过程
  exec(@sql)
end数据库内有按月生成的数据表 表的名称为年+月
jiankong201004
jiankong201005
jiankong201006
jiankong201007
.............执行存储过程的时候 如
exec cleartb '2010-04-1','2010-7-5'
的时候 如何清空掉 在给定的时间段的 这些表的数据

解决方案 »

  1.   

    jiankong201004
    jiankong201005
    jiankong201006
    jiankong201007
    .............
    -----
    到底表名一直到多少呢?
      

  2.   

    declare @tablename varchar(20),@i int
    select id=identity(int),name into # from sysobjects where xtype='u' and name like 'jiankong%'
    set @i=1
    while @i<=(select max(id) from #)
    begin 
    select @tablename=name from # where id=@i
    set @sql=N'delete from ’+@tablename+‘ where start_datetime between '''+CONVERT(char(19), @starttime, 20) +N''' and '' '+CONVERT(CHAR(19), @endtime, 20) +N''''
    set @i=@i+1
    exec(@sql)
    end
      

  3.   

     set @sql=N'delete from ’+@tablename+‘ where start_datetime between '''+CONVERT(char(19), @starttime, 20) +N''' and '' '+CONVERT(CHAR(19), @endtime, 20) +N''''
    循环添加表名呗
      

  4.   

    试试这个。
     declare @SQL varchar(max)
     declare @tablename nvarchar(100)
     set @tablename = 'jiankong'
     SELECT @SQL = isnull(@SQL+char(13),'') + 'truncate table '+ name  from sys.tables 
      where name between @tablename+convert(varchar(6),@starttime ,112) and @tablename+convert(varchar(6),@endtime,112)
      --PRINT @SQL 
      exec(@SQL)
      

  5.   


    ALTER PROCEDURE cleartb 
    @starttime datetime,
    @endtime datetime as
    begin
    declare @sql nvarchar(1000)
    declare @tmp datetime
    declare @tmp2 datetime
    declare @i int
    declare @maxi int declare @t table (id int IDENTITY(1,1) not null,
      tablename varchar(100) not null,
      st datetime not null,
      et datetime not null
      primary key (id))
    set @tmp = dateadd(m,1,convert(datetime,convert(varchar(7),@starttime,120)+'-01'))
    print @tmp
    if @tmp>= @endtime
    begin
    insert into @t
    select 'jiankong'+replace(convert(varchar(7),@starttime,120),'-',''),@starttime,@endtime
    end
    ELSE 
    BEGIN
    insert into @t
    select 'jiankong'+replace(convert(varchar(7),@starttime,120),'-',''),@starttime,DATEADD(D,-1,@tmp)
    while @tmp <= @endtime
    begin
    SET @tmp2  = DATEADD(M,1,@tmp)
    IF @tmp2<= @endtime
    BEGIN
    INSERT INTO @t
    SELECT 'jiankong'+replace(convert(varchar(7),@tmp,120),'-',''),@tmp,DATEADD(M,1,@tmp)
    END
    ELSE
    BEGIN
    INSERT INTO @t
    SELECT 'jiankong'+replace(convert(varchar(7),@tmp,120),'-',''),@tmp,@endtime
    END 
    set @tmp  = dateadd(m,1,@tmp)
    end 
    END select @maxi = max(id) from @t
    set @i = 1
    while @i  <= @maxi
    begin
    select @sql = 'delete from ' + tablename + 'where start_datetime between' + convert(varchar(10),st,120) +' and ' + convert(varchar(10),et,120) from @t where id = @i
    print @sql
    exec (@sql)
    set @i = @i+1
    end
    end--cleartb '2010-04-6','2010-7-10'
      

  6.   

    那就先根据时间段 去sysobjects 表里面找你要删除的表
    然后再循环删除
      

  7.   

     declare @starttime datetime,@endtime datetime;
     declare @SQL varchar(max)
     declare @tablename nvarchar(100)
     set @tablename = 'jiankong'
     IF day(@endtime+1) = 1 --是月末如果 @endtime 是月末则清楚所有满足条件的表的数据,用truncate,速度快。
     SELECT @SQL = isnull(@SQL+char(13),'') + 'truncate table '+ name  from sys.tables 
      where name between @tablename+convert(varchar(6),@starttime ,112) 
      and @tablename+convert(varchar(6),@endtime,112)
      --PRINT @SQL 
     ELSE --否则 清空开始时间到上个月的所有表数据,删除本月初到结束时间的所有数据
     begin
      SELECT @SQL = isnull(@SQL+char(13),'') + 'truncate table '+ name  from sys.tables 
      where name between @tablename+convert(varchar(6),@starttime ,112) 
      and @tablename+convert(varchar(6),dateadd(month,-1,@endtime),112)
      exec(@SQL)
      SET @SQL = 'delete from '+@tablename+convert(varchar(6),@endtime,112)' where start_datetime <= ' @endtime
      exec(@SQL)
     end 
      

  8.   

    没环境测试,建议将exec(@SQL) 换成PRINT @SQL 看一下打印的语句对不对。。