创建一个存储过程参数为 开始时间和结束时间
功能: 要求删除在给定的时间内 包含的表内的所有数据
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'
的时候 如何清空掉 在给定的时间段的 这些表的数据
功能: 要求删除在给定的时间内 包含的表内的所有数据
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'
的时候 如何清空掉 在给定的时间段的 这些表的数据
jiankong201005
jiankong201006
jiankong201007
.............
-----
到底表名一直到多少呢?
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
循环添加表名呗
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)
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'
然后再循环删除
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