簡體   English   中英

簡單的SQL查詢以啟動和監視SQL中的代理作業

[英]simple SQL query to Start and monitor the agent job in SQL

(從鏈接從存儲過程中執行SQL Server代理作業並返回作業結果中獲取的查詢

以下代碼中@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

完整參考在下面,線索在評論中

“您可能想檢查一下WHILE循環允許運行多長時間。我選擇將這部分保留在示例范圍之外。”

如注釋中所述,您應該插入一個檢查以阻止代碼永遠運行,例如:

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

循環檢查作業歷史記錄中的記錄。 如果存在,它將中斷循環,如果沒有,則會繼續使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM