我遇到了关于停止(查杀)查询的疑问:
有一个程序可以更改订阅者复制的数据量(我不知道所有细节,这是公司已经实现的一些功能),它在一个事务中,所以如果不是完成后它将回滚,同时执行此过程会阻止所有订户的复制,这就是为什么我们在夜间执行此操作时,订阅者复制的数量将减少或没有。这是周末,我想离开运行程序(星期五晚上10点),但如果没有完成,我希望它能够回滚,例如星期六早上6点,无需去办公室手动停止手续。
将其设置为晚上10点运行很容易我使用
waitfor time '22:00'
我知道在同一个查询中不能是一个可以停止整个查询的脚本,因为它是“顺序”的,有没有办法打开其他查询选项卡?我希望创造一份工作不是唯一的解决方案(如果它是一个解决方案)。
感谢您的回复。
答案 0 :(得分: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.
现在,可能还有其他一些问题 - 有时回滚可能需要的时间与(达到或超过)达到该点所需的时间一样长。这完全取决于长时间运行的进程(我将假设您正在重建/重组索引)。