【问题标题】:simple SQL query to Start and monitor the agent job in SQL在 SQL 中启动和监控代理作业的简单 SQL 查询
【发布时间】:2020-01-07 00:36:16
【问题描述】:

(从链接Executing SQL Server Agent Job from a stored procedure and returning job result获取的查询)

下面代码中@time_constraint的值是什么

WHILE @time_constraint = @ok        
    @time_constraint ?
    @ok?** Here @time_Constrain denotes???????

use msdb
-- Start job
DECLARE @job_name NVARCHAR(MAX) = 'Demo_Test'
EXEC msdb.dbo.sp_start_job @job_name = @job_name


-- Wait for job to finish
DECLARE @job_history_id AS INT = NULL

WHILE @time_constraint = @ok
BEGIN
    SELECT TOP 1 @job_history_id = activity.job_history_id
    FROM msdb.dbo.sysjobs jobs
    INNER JOIN msdb.dbo.sysjobactivity activity ON activity.job_id = jobs.job_id
    WHERE jobs.name = @job_name
    ORDER BY activity.start_execution_date DESC

    IF @job_history_id IS NULL
    BEGIN
        WAITFOR DELAY '00:00:10'
        CONTINUE
    END
    ELSE
        BREAK
END


-- Check exit code
SELECT history.run_status
FROM msdb.dbo.sysjobhistory history
WHERE history.instance_id = @job_history_id

【问题讨论】:

  • 这是您的代码 - 您希望我们如何知道它是如何工作的?
  • 如果您偶然从其他地方“获取”了代码,您需要确认作为参考。
  • 由 lapponiandevil
  • 它不是完整的代码,它的伪代码,而且我可以说它只是说“把你自己的条件放在这里以确保循环不会永远等待”。但是,您可以通过在他们的答案中添加评论并标记他们的名字来直接询问作者。

标签: sql sql-server


【解决方案1】:

循环检查作业历史记录的位置。如果有,则中断循环,如果没有,则继续使用WAITFOR 等待。由于永远等待可能是一个坏主意,因此应该有一个额外的时间限制条件。这就是作者对@time_constraint = @ok 的意思,虽然名字不是最好的。

例如:

DECLARE @MaxWaitingTimeInMinutes INT = 5

DECLARE @StartTime DATETIME = GETDATE()

WHILE DATEDIFF(MINUTE, @StartTime, GETDATE()) <= @MaxWaitingTimeInMinutes
BEGIN

    -- Check for job's history. Break if exists, wait if not.

END

另一个例子:

DECLARE @WaitUntil DATETIME = DATEADD(MINUTE, 5, GETDATE())

WHILE GETDATE() <= @WaitUntil
BEGIN

    -- Check for job's history. Break if exists, wait if not.

END

【讨论】:

    【解决方案2】:

    全文参考如下,线索在评论中

    “您可能需要检查允许 WHILE 循环运行多长时间。我选择将该部分排除在示例之外。”

    如 cmets 中所述,您应该插入一个检查以阻止代码永远运行,例如:

    DECLARE @time_constraint datetime 
    DECLARE @ok datetime
    
    SET @time_constraint = DATEADD(second, 5, GETDATE()) -- Run for 5 seconds 
    SET @ok = GETDATE()
    
    SELECT @time_constraint as future, @ok as [current]
    
    WHILE @time_constraint > @ok BEGIN      
       SELECT @ok = GETDATE() 
    END
    

    对于所有不允许使用 OPENROWSET 命令的人, 这可能会有所帮助。我在这里找到了解决方案的起点:

    http://social.msdn.microsoft.com/Forums/en-US/89659729-fea8-4df0-8057-79e0a437b658/dynamically-checking-job-status-with-tsql

    这取决于以下事实: 作业后首先填充 msdb.dbo.sysjobactivity 表 以一种或另一种方式结束。

    -- Start job
    DECLARE @job_name NVARCHAR(MAX) = 'JobName'
    EXEC msdb.dbo.sp_start_job @job_name = @job_name
    
    
    -- Wait for job to finish
    DECLARE @job_history_id AS INT = NULL
    
    WHILE @time_constraint = @ok
    BEGIN
        SELECT TOP 1 @job_history_id = activity.job_history_id
        FROM msdb.dbo.sysjobs jobs
        INNER JOIN msdb.dbo.sysjobactivity activity ON activity.job_id = jobs.job_id
        WHERE jobs.name = @job_name
        ORDER BY activity.start_execution_date DESC
    
        IF @job_history_id IS NULL
        BEGIN
            WAITFOR DELAY '00:00:10'
            CONTINUE
        END
        ELSE
            BREAK
    END
    
    
    -- Check exit code
    SELECT history.run_status
    FROM msdb.dbo.sysjobhistory history
    WHERE history.instance_id = @job_history_id
    

    您可能需要检查 WHILE 循环的持续时间 允许运行。我选择将该部分排除在示例之外。

    Microsoft 退出代码等指南: http://technet.microsoft.com/en-us/library/ms174997.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 2017-11-11
      相关资源
      最近更新 更多