从脚本停止长时间运行的存储过程

时间:2011-10-11 14:33:32

标签: sql tsql sql-server-2008

我在几个由主存储过程触发的数据库中有一组维护任务。使用sp_procoption启动主存储过程以在mssql启动时启动。然后在指定的日期和时间,在我的所有数据库中运行子程序。

我需要更新这个主脚本。

要清理更新过程,并且不需要停止并重新启动sql(以确保只有一个主过程实例正在运行),我希望能够停止存储过程,然后在结束时重新启动它更新脚本。重新启动不是问题,但是有人知道从更新脚本中停止该过程的方法吗?

这是我的主调度过程的脚本:

USE master
GO
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'weekly_maintenance_task')
    DROP PROCEDURE weekly_maintenance_task
GO
CREATE PROCEDURE [dbo].[weekly_maintenance_task]
AS
BEGIN

    SET NOCOUNT ON
    DECLARE @timeToRun nvarchar(50)
    SET @timeToRun = '02:30:00'
    DECLARE @dayToRun nvarchar(10)
    SET @dayToRun = 'SUNDAY'


    WHILE 1 = 1
    BEGIN
        WAITFOR time @timeToRun
        BEGIN
            DECLARE @dayOfWeek NVARCHAR(10)
            SELECT @dayOfWeek = CASE DATEPART(weekday, GETDATE())
            WHEN 1 THEN 'SUNDAY'
            WHEN 2 THEN 'MONDAY'
            WHEN 3 THEN 'TUESDAY'
            WHEN 4 THEN 'WEDNESDAY'
            WHEN 5 THEN 'THURSDAY'
            WHEN 6 THEN 'FRIDAY'
            WHEN 7 THEN 'SATURDAY'
            END
            IF (@dayOfWeek = @dayToRun)
            BEGIN
                EXECUTE sp_msforeachdb 'USE ?
                IF DB_NAME() NOT IN (''master'', ''msdb'',''tempdb'',''model'')
                    IF EXISTS (select * from sys.procedures where name=''database_maintenance_weekly'')
                        EXECUTE database_maintenance_weekly'
            END
        END
    END
END

GO

sp_procoption @ProcName = 'weekly_maintenance_task',
              @OptionName = 'startup',
              @OptionValue = 'on'
GO

2 个答案:

答案 0 :(得分:3)

您可以使用kill命令终止会话。您可以使用dm_exec_requestssys.fn_get_sql()找到合适的会话。

declare @nuke_spid int

select  @nuke_spid = session_id
from    sys.dm_exec_requests r 
outer apply sys.fn_get_sql(r.sql_handle) s
where   s.text like '%dm_exec_requests r%'

exec ('kill ' + @nuke_spid)

这应该返回Cannot use KILL to kill your own process.

答案 1 :(得分:-1)

为什么在无限循环中运行存储过程?只需安排一份工作,即可在指定的日期/时间运行您的SP。