Остановка долго выполняющейся хранимой процедуры из скрипта - PullRequest
0 голосов
/ 11 октября 2011

У меня есть набор задач обслуживания в нескольких базах данных, которые запускаются основной хранимой процедурой.Главная хранимая процедура запускается с помощью 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 ]

3 голосов
/ 11 октября 2011

Вы можете использовать команду kill, чтобы завершить сеанс.Вы можете найти правильный сеанс с dm_exec_requests и sys.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.

0 голосов
/ 11 октября 2011

Зачем запускать хранимую процедуру в бесконечном цикле?Просто запланируйте работу для запуска ваших SP в определенную дату / время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...