[英]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命令的所有人,這可能會有所幫助。 我在這里找到了解決方案的起點:
這依賴於以下事實:作業以一種或另一種方式完成后,首先填充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.