我正在尝试检查竞争的 SQL 作业是否正在运行,因为它们共享同一个表。我们希望通过锁定表来确保一个不会阻塞另一个。
问题是我们有一个作业每 15 秒运行一次,我们首先检查作业是否已经在运行。但无论如何(意味着如果没有正在运行的作业)它都不会运行。但是,如果我采用完全相同的查询并在 SSIS 中手动运行它,它会完美运行。
这是查询:
declare @return_value int,
@messagesUpdated int,
@dlrsDeleted int
if not exists (
select 1
from msdb.dbo.sysjobs_view job
inner join msdb.dbo.sysjobactivity activity on job.job_id = activity.job_id
where
activity.run_Requested_date is not null
and activity.stop_execution_date is null
)
begin
exec @return_value = [dbo].[updateDeliveryReceipts]
@messagesUpdated = @messagesUpdated OUTPUT,
@dlrsDeleted = @dlrsDeleted OUTPUT
end
select @messagesUpdated as N'@messagesUpdated',
@dlrsDeleted as N'@dlrsDeleted'
select 'Return Value' = @return_value
但是如果我进行此检查以查看作业当前是否正在运行......它运行得很好。
if not exists (
select 1
from msdb.dbo.sysjobs_view job
inner join msdb.dbo.sysjobactivity activity on job.job_id = activity.job_id
where
activity.run_Requested_date is not null
and activity.stop_execution_date is null
)
我知道这可能是一个简单的修复...但我一生都无法弄清楚。
如有任何帮助,我们将不胜感激!
谢谢
在 Windows Server 上运行的 SQL Server 2017 标准版
这是我们使用的东西。如果您希望作业 B 检查作业 A 是否仍在运行,并等待作业 A 完成,则将此脚本作为作业 B 中的第一步。将
@JobName
更改为您要等待的作业的名称。
DECLARE @JobName SYSNAME;
SET @JobName = 'Job A';
WHILE 1 = 1
BEGIN
IF EXISTS (
SELECT
*
FROM
msdb.dbo.sysjobactivity ja
LEFT JOIN msdb.dbo.sysjobhistory jh ON ja.job_history_id = jh.instance_id
JOIN msdb.dbo.sysjobs j ON ja.job_id = j.job_id
JOIN msdb.dbo.sysjobsteps js ON ja.job_id = js.job_id
AND ISNULL(ja.last_executed_step_id, 0) + 1 = js.step_id
WHERE
ja.session_id = (
SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC
)
AND start_execution_date IS NOT NULL
AND stop_execution_date IS NULL
AND j.name = @JobName
)
BEGIN
PRINT @JobName + ' is currently running. Waiting 15 minutes to check again.';
WAITFOR DELAY '00:00:15'
END
ELSE
BEGIN
PRINT @JobName + ' is not running. We are good to go!'
BREAK;
END
END
免责声明:我没有写这个。我工作的其他人也这么做了。我真的不知道在作业步骤中不断运行循环的全部含义,但只能说我们的服务器上没有发生任何值得注意的事情。