SQL Server 作业同时运行...尝试检查其中一个作业是否正在运行

问题描述 投票:0回答:1

我正在尝试检查竞争的 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 标准版

sql-server
1个回答
0
投票

这是我们使用的东西。如果您希望作业 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

免责声明:我没有写这个。我工作的其他人也这么做了。我真的不知道在作业步骤中不断运行循环的全部含义,但只能说我们的服务器上没有发生任何值得注意的事情。

© www.soinside.com 2019 - 2024. All rights reserved.