2012-05-18 4 views
0

я сталкивался с сомнением относительно остановки (убийство) запроса:запросы SQL Server 2005 Killing времени

Там есть процедура, которая изменяет количество данных, которые абонент повторность (я не знаю, все детали, это какая-то функциональность, уже реализованная компанией), она находится в транзакции, поэтому, если она не завершилась, она будет отката, а при выполнении этой процедуры репликация для всех подписчиков заблокирована, поэтому мы выполняем эту операцию в ночное время, когда количество тиражей подписчиков будет меньше или равно. Это выходные, и я хочу оставить процедуру (пятница 10 вечера), но я бы хотел, чтобы она откатилась, если она не закончилась, например. в 6 часов утра в субботу и без необходимости идти в офис, чтобы остановить процедуру вручную.

установить его для работы на 10pm легко я использовал

waitfor time '22:00' 

Я знаю, что в одном запросе не может быть сценарий, который может остановить весь запрос, так как он является «последовательным», есть ли способ сделать это, открыв другую вкладку запросов? Надеюсь, что создание задания - не единственное решение (если это вообще решение).

Благодарим за ответы.

+0

hmm well, вы можете определенно сделать это из сценария powershell, установив ComandTimeout на объект Command, но это может быть не то, что вы ищете –

+0

Спасибо за ваш ответ, если он не слишком много спрашивает, может пожалуйста, предоставьте мне пример с вашей идеей, это может быть временное решение для него (я имею в виду временное, если решение от SQL Server Management Studio выглядит иначе, это может быть единственным решением :)) –

+0

Можете ли вы объяснить, почему вы хотите это как некоторый скрипт, оставленный открытым в Management Studio (который добавляет некоторые моменты сбоя) и почему работа звучит как такое плохое решение? Если вы создадите его и запустите его как задание, вы можете легко написать второе задание сторожевого таймера, которое просыпается, проверяет, работает ли работа, и если да, то убивает. –

ответ

0

Я предлагаю самый простой способ справиться с этим, поставив свой долговременный процесс на работу. Не требует открытого экземпляра Management Studio с надежным активным сетевым подключением к серверу с вашей рабочей станции, и поскольку задание может запускать только один экземпляр за раз, будет гораздо проще работать с определением фактического процесса, который выполняется (и справиться с ним соответственно).

Итак, скажем, я убедил вас, и у вас есть работа под названием «Работа, которую я хочу убить», которая запланирована на пятницу вечером в 10 часов вечера. Следующая хранимая процедура может быть запланирована как отдельное задание, в субботу утром в 6:00 или вызвана вручную.

CREATE PROCEDURE dbo.Kill_Job_I_Wanna_Kill 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @id UNIQUEIDENTIFIER; 

    -- since the job could be dropped and re-created: 
    SELECT @id = job_id 
    FROM msdb.dbo.sysjobs 
    WHERE name = 'Job I wanna kill'; 
    -- note that it could also be renamed, so you'll have to 
    -- decide how to properly identify this job in the long run 

    DECLARE @t TABLE 
    (
    ID VARBINARY(32), rd INT, rt INT, nrd INT, 
    nrt INT, nrs INT, rr INT, rs INT, rsID SYSNAME, 
    Running BIT, cs INT, cra INT, [state] INT 
); 

    -- note that this XP is undocumented and unsupported! 
    INSERT @t EXEC master.dbo.xp_sqlagent_enum_jobs 1, 'sa', @id; 

    IF EXISTS (SELECT 1 FROM @t WHERE Running = 1) 
    BEGIN 
    PRINT 'Cancelling job!'; 
    EXEC msdb.dbo.sp_stop_job @job_id = @id; 
    END 
    ELSE 
    BEGIN 
    PRINT 'Job is not running!' 
    END 
END 
GO 

Когда задание успешно убит, следующий будет рассматриваться как распечатке при вызове вручную или в истории этапе работы, когда планируется:

Cancelling job! 
Job 'Job I wanna kill' stopped successfully. 

Теперь, могут быть и другие осложнения - иногда откат может занять столько времени, сколько потребуется (или дольше), чтобы добраться до этой точки. Все зависит от того, что делает длительный процесс (я собираюсь предположить, что вы перестраиваете/реорганизуете индексы).