2011-10-11 158 views
0

我在由主存儲過程觸發的幾個數據庫中擁有一組維護任務。主存儲過程使用sp_procoption在mssql啓動時啓動。然後在指定的日期和時間,在我的所有數據庫中運行子程序。從腳本中停止長時間運行的存儲過程

我需要更新這個主腳本。

要清理更新過程,並且不需要停止並重新啓動sql(以確保只有一個主過程實例正在運行),我希望能夠停止存儲過程,然後在最後重新啓動它的更新腳本。重新啓動不是問題,但有誰知道一種方法來停止更新腳本中的過程?

這裏是我的主生產計劃PROC腳本:

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 

回答

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

爲什麼在一個無限循環中運行存儲過程?只需安排一項工作即可在指定的日期/時間運行SP。