【问题标题】:How to skip a job step based on outcome of previous SQL Agent job step?如何根据先前 SQL 代理作业步骤的结果跳过作业步骤?
【发布时间】:2012-05-01 00:16:09
【问题描述】:

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

【问题讨论】:

  • 好的。您有问题要问我们吗?
  • 那么你在纠结哪一点?
  • 这完全取决于所使用的 DBMS。为一个 DBMS 执行此操作的命令与任何其他 DBMS 完全无关。
  • @Siva:啊,是的......旧的'将重要信息隐藏在标题中,而不是将其放在问题正文或标签中'的伎俩。感谢您更新标签。

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


【解决方案1】:

您可以将步骤 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

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

步骤 N 可以这么简单:

PRINT 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/

    【讨论】:

      【解决方案3】:

      将以下代码放入作业的第 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;
      

      【讨论】:

      • 请尝试解释您的答案,以便人们向他们学习
      猜你喜欢
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      相关资源
      最近更新 更多