0

我遇到了关于停止(杀死)查询的疑问:

有一个程序可以更改订阅者复制的数据量(我不知道所有细节,这是公司已经实现的一些功能),它在事务中,所以如果它没有完成它会回滚,在执行此过程时,所有订阅者的复制都被阻止,这就是为什么我们在夜间复制的订阅者数量将减少或没有时执行此操作的原因。现在是周末,我想离开运行程序(周五晚上 10 点),但如果它没有完成,例如周六早上 6 点,我希望它回滚,并且不需要去办公室手动停止程序.

设置它在晚上 10 点运行很容易我用过

waitfor time '22:00'

我知道在同一个查询中不能是一个可以停止整个查询的脚本,因为它是“顺序的”,有没有办法打开其他查询选项卡?我希望创造工作不是唯一的解决方案(如果它是一个解决方案的话)。

谢谢您的回复。

4

1 回答 1

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.

现在,可能还有其他复杂情况 - 有时回滚可能需要与到达该点所需的时间一样长(或更长)。这完全取决于长期运行的过程正在做什么(我假设您正在重建/重组索引)。

于 2012-05-18T18:38:38.977 回答