如何根据以前的SQL代理作业步骤的结果跳过作业步骤?

时间:2012-05-01 00:16:10

标签: sql-server tsql sql-agent-job

我正在尝试创建一个基于数据库在线状态运行的作业。例如,步骤1将检查数据库是否在线;如果数据库在线,它将运行其余步骤,否则,它将报告该作业成功。

3 个答案:

答案 0 :(得分:14)

您可以将步骤1设置为:

DECLARE @dbState TINYINT;
SELECT @dbState = state FROM sys.databases WHERE name = N'dbname';
IF @dbState = 0
BEGIN
  RAISERROR('Database is online.', 11, 1);
END

将步骤1的属性设置为:

  • 成功,转到第2步
  • 失败时,请转到步骤N

步骤2 - > n-1会做正常的事情。步骤n-1可能会在成功时退出工作,或者在成功时转到步骤N.

步骤N可以简单如下:

PRINT 1;

......并将成功退出工作。

答案 1 :(得分:2)

通常我使用On Success / On Failure来控制流程。如果你有不同的分支,在每个“分支”的末尾必须有一个NO-OP步骤进入延续:

Step 1 - Some Op - On Failure Goto Step 4, On Success Go to next step
Step 2 - Some Op
Step 3 - Goto continuation step
Step 4 - Some op
...
Step n - Continnuation step
Step n+1 - finish the common processing

无论如何,使用GOTO管理这种线性流并不会增加复杂的逻辑流程。

http://www.sqlservercentral.com/articles/Stairway+Series/72457/

答案 2 :(得分:0)

将以下代码放在作业的步骤1中。它会检查它是否为主要文件(指定DAG的名称),如果不是,则停止该作业。

-- Do I wish this job to continue or not...
-- e.g. Is this the Primary in the DAG
-- If not, stop the job
DECLARE @rc int; 
EXEC @rc = dbo.fn_hadr_group_is_primary N'DAG_001';

IF @rc = 0
BEGIN;
    DECLARE @JobID uniqueidentifier
    SELECT @JobID = $(ESCAPE_NONE(JOBID));
    EXEC msdb.dbo.sp_stop_job @job_id = @JobID;
END;