Sqlserver Sql Agent Job 只能同时有一个实例运行

Sqlserver Sql Agent中的Job默认情况下只能有一个实例在运行,也就是说假如你的Sql Agent里面有一个正在运行的Job叫"Test Job",如果你现在再去启动一次"Test Job"就会报错,因为Sqlserver规定在一个Sqlserver账号下,Sql Agent不能同时启动相同的Job两次,只有前一次启动执行完成后,才能够再次启动该Job。

那么随之而来的问题是如何用sql语句检测Job是否已经执行完毕了呢?下面有一个语句可以作为参考:

Declare @Job_ID as UNIQUEIDENTIFIER
select @Job_ID =Job_ID from msdb.dbo.sysjobs where name = ‘James_Test‘--name就是Job的名字

Exec master..sp_MSget_jobstate @Job_ID  --返回值为 1 - 正在运行,4 - 表示完成(成功或失败)

以上语句的关键就是调用一个master库中的系统存储过程sp_MSget_jobstate,这个存储过程的结构可以从Sqlserver中查到如下,必要时可以建立一个自定义存储过程进行修改:

USE [master]
GO
/****** Object:  StoredProcedure [sys].[sp_MSget_jobstate]    Script Date: 2016/1/29 13:51:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- Procedure sp_MSget_jobstate
--
-- Descriptions:
--    The proc takes a specific Job ID and returns the Job State of the job
--        Returns a row with one column job_state
--        Returns a row with NULL if job does not exist
--
-- Parameters: as defined in create statement
--
-- Returns: 0 - success
--          1 - Otherwise
--
-- Security:
-- Requires Certificate signature for catalog access
--
ALTER procedure [sys].[sp_MSget_jobstate]
    @job_id             UNIQUEIDENTIFIER
AS
BEGIN
    DECLARE @is_sysadmin INT
    DECLARE @job_owner   sysname
    DECLARE @job_state   INT
    DECLARE @job_id_as_char VARCHAR(36)

    SET NOCOUNT ON

    CREATE TABLE #xp_results (job_id                UNIQUEIDENTIFIER NOT NULL,
                            last_run_date         INT              NOT NULL,
                            last_run_time         INT              NOT NULL,
                            next_run_date         INT              NOT NULL,
                            next_run_time         INT              NOT NULL,
                            next_run_schedule_id  INT              NOT NULL,
                            requested_to_run      INT              NOT NULL, -- BOOL
                            request_source        INT              NOT NULL,
                            request_source_id     sysname          collate database_default null,
                            running               INT              NOT NULL, -- BOOL
                            current_step          INT              NOT NULL,
                            current_retry_attempt INT              NOT NULL,
                            job_state             INT              NOT NULL)

    -- Need a job_id
    if (@job_id IS NULL)
    BEGIN
        SELECT @job_id_as_char = CONVERT(VARCHAR(36), @job_id)
        RAISERROR(14262, -1, -1, ‘@job_id‘, @job_id_as_char)
        RETURN(1) -- Failure
    END

    -- Capture job execution information (for local jobs only since that‘s all SQLServerAgent caches)
    SELECT @is_sysadmin = ISNULL(IS_SRVROLEMEMBER(N‘sysadmin‘), 0)
    SELECT @job_owner = suser_sname(suser_sid())
    INSERT INTO #xp_results
    EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner

    -- Select the job state of the job in question
    SELECT @job_state = job_state FROM #xp_results WHERE @job_id = job_id

    -- Error if we have no rows selected
    if (@job_state IS NULL)
    BEGIN
        SELECT @job_id_as_char = CONVERT(VARCHAR(36), @job_id)
        RAISERROR(14262, -1, -1, ‘@job_id‘, @job_id_as_char)
        RETURN(1) -- Failure
    END
    ELSE
        SELECT @job_state

    -- All done
    DROP TABLE #xp_results
    RETURN(0)    -- Success
END

如果查询到Sql Agent中的Job正在执行,可以使用存储过程msdb.dbo.sp_stop_job强制停止Job,然后再使用存储过程msdb.dbo.sp_start_job来启动Job,需要注意的是如果在已经停止的Job上调用msdb.dbo.sp_stop_job或者在正在执行的Job上调用msdb.dbo.sp_start_job会报错,所以在调用存储过程msdb.dbo.sp_start_job和msdb.dbo.sp_stop_job前需要判断Job的当前执行状态,或者使用sql的Try Catch语句来捕获错误,msdb.dbo.sp_stop_job和msdb.dbo.sp_stop_job的使用方法如下所示:

EXEC msdb.dbo.sp_start_job @job_name=‘Job_name‘--Job_name就是Job的名字
EXEC msdb.dbo.sp_stop_job    @job_name=‘Job_name‘--Job_name就是Job的名字
时间: 2024-10-13 11:22:43

Sqlserver Sql Agent Job 只能同时有一个实例运行的相关文章

【原创】大叔经验分享(82)logstash一个实例运行多个配置文件

logstash一个实例运行多个配置文件,将所有配置文件放到以下目录即可 /usr/share/logstash/pipeline 但是默认行为不是每个配置文件独立运行,而是作为一个整体,每个input会匹配所有的filter,然后匹配所有的output,可能会导致数据被错误的处理以及发送到错误的地方: 解决方法一: 在input中设置一个变量,在filter和output中判断该变量,实现每个配置文件独立运行,不会相互影响,使用哪个变量呢? input默认有很多通用参数,但是只有type可用,

WPF程序只有一个实例运行

WPF程序只运行一个实例: 下面的代码还 尝试,如果窗体最小化的时候,让窗体还原 public partial class App : Application { private static Semaphore singleInstanceWatcher; private static bool createdNew; static App() { // Ensure other instances of this application are not running. singleInst

转 C# 只允许运行一个实例

来源:http://blog.csdn.net/jin20000/article/details/3136791 互斥进程(程序), 简单点说,就是在系统中只能有该程序的一个实例运行. 现在很多软件都有这功能,如Maxthon 可以设置为"只允 许打开一个窗体",还有Bitcomet等. 我也是看到这些软件的这个功能才来研究这个问题的.  要实现程序的互斥,通常有三中方式,下面 用 C#  语言来实现: 实现方式一: 使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.C#实现如

Java程序只运行一个实例[转]

如果希望你的Java程序只能存在一个实例,可以参考下面的用法. 原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729 Java没有提供这样的机制.从操作系统的观点来看,一个启动的Java Application仅仅是一个JVM的运行实例.运行相同Application的两个实例,仅仅是运行两个无关的JVM.       只有让多个运行实例之间有一个既定的通讯机制就可以保证只有一个实例运行. 方案1:使用Java的加锁文件机制,ide

SQL Agent 服务无法启动

问题现象 从阿里云上镜像过来的一台的数据库服务器,SQL Agent服务启动不了,提示服务启动后停止. 如下是系统日志和SQL Agent的日志 SQLServerAgent could not be started (reason: 无法连接到服务器“(local)”:SQLServerAgent 无法启动) 2016-05-20 11:09:03 - ? [100] Microsoft SQLServerAgent 版本 11.0.3000.0 (内部版本号 X64 unicode 零售):

设置Sql Agent运行Job时的执行账户

相信使用过Sql Server的人都应该知道,使用Sql Agent可以建立一些自动化Job来帮我们周期性地执行一些任务,其中执行SSIS包就是其中一个任务.而在SSIS包中有时候会去做读取文件等一些本地化操作,如果执行Sql Agent任务的执行账户权限不够有可能造成SSIS包无法读取文件执行失败.所以我们有时候需要去指定用哪一个账户去执行Sql Agent的任务. 1.要指定Sql Agent任务的执行账户首先要建立一个数据库凭证,如下图所示: 2.建立凭证时选择的标识(下图红色框指定的账户

新建一个用户,让他只能看到某一个视图(View),如何设置

新建一个用户,让他只能看到某一个视图(View),怎么设置? 新建一个用户,让他只能看到某一个视图(View),怎么设置? 如果做不到“只能看到指定视图”,最好能做到“对指定表或视图只有查询的权限”. 谢谢!------解决思路----------------------在指定权限时只对视图授权 USE [master] GO CREATE LOGIN [Test] WITH PASSWORD=N'1', DEFAULT_DATABASE=[DB], CHECK_EXPIRATION=OFF, 

在configure distribution时遇到错误,不能打开sql agent

今天在配置Distribution时,遇到一个错误,不能打开sql agent,详细错误信息如下: SQL Server blocked access to procedure 'dbo.sp_set_sqlagent_properties' of component 'Agent XPs' because this component is turned off as part of the security configuration for this server. A system ad

SQL Agent服务无法启动如何破

问题现象 从阿里云上镜像过来的一台的数据库服务器,SQL Agent服务启动不了,提示服务启动后停止.(原数据库服务器是正常的,怀疑跟镜像有关) 如下是系统日志和SQL Agent的日志 SQLServerAgent could not be started (reason: 无法连接到服务器“(local)”:SQLServerAgent 无法启动) 2016-05-20 11:09:03 - ? [100] Microsoft SQLServerAgent 版本 11.0.3000.0 (内