Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql SQL Server 2005按时间终止查询_Tsql_Sql Server 2005 - Fatal编程技术网

Tsql SQL Server 2005按时间终止查询

Tsql SQL Server 2005按时间终止查询,tsql,sql-server-2005,Tsql,Sql Server 2005,我遇到了一个关于停止(终止)查询的疑问: 有一个过程可以更改订阅服务器复制的数据量(我不知道所有详细信息,这是公司已经实现的一些功能),它位于事务中,因此如果未完成,它将回滚,同时执行此过程会阻止所有订阅服务器的复制,这就是为什么我们在夜间执行此操作,此时复制的订阅者数量将减少或没有。这是周末,我想离开运行程序(周五晚上10点),但如果程序没有完成,我希望它回滚,例如周六早上6点,不需要去办公室手动停止程序 CREATE PROCEDURE dbo.Kill_Job_I_Wanna_Kill A

我遇到了一个关于停止(终止)查询的疑问:

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

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
设置它运行在晚上10点是很容易的,我已经使用

waitfor time '22:00'
我知道,在同一个查询中,不能有一个脚本可以停止整个查询,因为它是“连续的”,有没有办法打开其他查询选项卡?我希望创造就业机会不是唯一的解决办法(如果这是一个解决办法的话)


感谢您的回复。

我建议最简单的处理方法是将长期运行的流程放入作业中。不需要一个开放的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.

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

hmm您完全可以通过powershell脚本在命令对象上设置ComandTimeout来完成此操作,但这可能不是您想要的感谢您的回复,如果不是太多要求,你能给我举一个例子来说明你的想法吗?它可能是一个临时解决方案(我的意思是,如果出现了来自SQL Server Management Studio的解决方案,那么它可能是唯一的解决方案:)。你能解释一下为什么要在Management Studio中打开某些脚本(这会增加一些失败点)为什么一份工作听起来像是一个糟糕的解决方案?如果你创建了一个作业并将其作为作业运行,你可以很容易地编写第二个看门狗作业,该作业会被唤醒,检查作业是否正在运行,如果正在运行,则将其杀死。亲爱的Aaron,这并不是说创建一个作业是一个糟糕的解决方案,我的意思是“我知道我的作业可能是解决方案,但我希望有其他一些很酷的工作可以解决我的问题”,但是用较少的语言表达。请不要冒犯我,但我没有在任何时候表达过这是一个坏主意,也没有表达过这是一个好主意,我尝试过保持中立,因为我对任何与SQL Server相关的东西都还很陌生。但谢谢你的评论。@Aaron谢谢你的回复,我仍然开始寻找关于创造看门狗工作的建议:)