求sqlserver存储过程 实现表数据的定时删除

解决方案 »

  1.   


    CREATE PROCEDURE 存储过程名
    delete 表名 然后在【sql server代理】里边做个【作业】,定时执行该存储过程就行了
      

  2.   

    除非你的存储过程一直运行,否则无法实现定时删除,如果一直运行,那可能会扰乱一些性能统计信息。所以比较实际的方法是使用辅助功能,比如SQLServer的作业,或者powershell来实现,甚至在os层面实现,但是最简单还是用SQLServer作业。
      

  3.   

    用存储过程+JOB实现,创建一个删除表数据的存储过程,通过JOB定时执行删除
      

  4.   

    通过脚本创建JOB:   
    if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N[dbo].[p_createjob])   and   OBJECTPROPERTY(id,   NIsProcedure)   =   1)   
      drop   procedure   [dbo].[p_createjob]   
      GO   
        
      create   proc   p_createjob   
      @jobname   varchar(100),                           --作业名称   
      @sql   varchar(8000),                                 --要执行的命令   
      @serverName   sysname=,                         --job   server名   
      @dbname   sysname=,                                 --默认为当前的数据库名   
      @freqtype   varchar(6)=day,                 --时间周期,month   月,week   周,day   日   
      @fsinterval   int=1,                                   --相对于每日的重复次数   
      @time   int=170000                                       --开始执行时间,对于重复执行的作业,将从0点到23:59分   
      as   
      if   isnull(@dbname,)=   set   @dbname=db_name()   
        
      --创建作业   
      exec   msdb..sp_add_job   @job_name=@jobname   
        
      --创建作业步骤   
      exec   msdb..sp_add_jobstep   @job_name=@jobname,   
                      @step_name   =   数据处理,   
                      @subsystem   =   TSQL,   
                      @database_name=@dbname,   
                      @command   =   @sql,   
                      @retry_attempts   =   5,   --重试次数   
                      @retry_interval   =   5     --重试间隔   
        
      --创建调度   
      declare   @ftype   int,@fstype   int,@ffactor   int   
      select   @ftype=case   @freqtype   when   day   then   4   
                                                                                      when   week   then   8   
                                                                                      when   month   then   16   end   
                      ,@fstype=case   @fsinterval   when   1   then   0   else   8   end   
      if   @fsinterval<>1   set   @time=0   
      set   @ffactor=case   @freqtype   when   day   then   0   else   1   end   
        
      EXEC   msdb..sp_add_jobschedule   @job_name=@jobname,     
                      @name   =   时间安排,   
                      @freq_type=@ftype   ,                                                 --每天,8   每周,16   每月   
                      @freq_interval=1,                                                     --重复执行次数   
                      @freq_subday_type=@fstype,                                   --是否重复执行   
                      @freq_subday_interval=@fsinterval,                   --重复周期   
                      @freq_recurrence_factor=@ffactor,   
                      @active_start_time=@time                                       --下午17:00:00分执行   
        
      if   @servername=   
      set   @servername=@@servername   
      EXEC   msdb..sp_add_jobserver   @job_name   =   @jobname,     
                @server_name   =   @servername   
        
      go     
        
      --调用   
      --每天执行的作业   
      exec   p_createjob   @jobname=dd   
                                        ,@sql=insert   B   select   convert(char(10),getdate(),120),1+(select   max([text])   from   B)   
                                        ,@servername=job服务器名   
                                        ,@dbname=数据库名   
                                        ,@freqtype=day   
                                        ,@time=000000  
    ===============================================================
    --每月执行的作业
    exec p_createjob @jobname=mm,@sql=select * from syscolumns,@freqtype=month
    --每周执行的作业
    exec p_createjob @jobname=ww,@sql=select * from syscolumns,@freqtype=week
    --每日执行的作业
    exec p_createjob @jobname=a,@sql=select * from syscolumns
    --每日执行的作业,每天隔4小时重复的作业
    exec p_createjob @jobname=b,@sql=select * from syscolumns,@fsinterval=4
    --*/
    if exists (select * from dbo.sysobjects where id = object_id(N[dbo].[p_createjob]) and OBJECTPROPERTY(id, NIsProcedure) = 1)
    drop procedure [dbo].[p_createjob]
    GO
    create proc p_createjob
    @jobname varchar(100),--作业名称
    @sql varchar(8000),--要执行的命令
    @dbname sysname=,--默认为当前的数据库名
    @freqtype varchar(6)=day,--时间周期,month 月,week 周,day 日
    @fsinterval int=1,--相对于每日的重复次数
    @time int=170000--开始执行时间,对于重复执行的作业,将从0点到23:59分
    as
    if isnull(@dbname,)= set @dbname=db_name()
    --创建作业
    exec msdb..sp_add_job @job_name=@jobname
    --创建作业步骤
    exec msdb..sp_add_jobstep @job_name=@jobname,
    @step_name = 数据处理,
    @subsystem = TSQL,
    @database_name=@dbname,
    @command = @sql,
    @retry_attempts = 5, --重试次数
    @retry_interval = 5  --重试间隔
    --创建调度
    declare @ftype int,@fstype int,@ffactor int
    select @ftype=case @freqtype when day then 4
    when week then 8
    when month then 16 end
    ,@fstype=case @fsinterval when 1 then 0 else 8 end
    if @fsinterval<>1 set @time=0
    set @ffactor=case @freqtype when day then 0 else 1 end
    EXEC msdb..sp_add_jobschedule @job_name=@jobname, 
    @name = 时间安排,
    @freq_type=@ftype , --每天,8 每周,16 每月
    @freq_interval=1,--重复执行次数
    @freq_subday_type=@fstype,--是否重复执行
    @freq_subday_interval=@fsinterval, --重复周期
    @freq_recurrence_factor=@ffactor,
    @active_start_time=@time  --下午17:00:00分执行
    -- 添加目标服务器
    EXEC msdb.dbo.sp_add_jobserver 
    @job_name = @jobname ,
    @server_name = N(local) 
    go