6

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

4

3 回答 3

16

好吧,您可以将第 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;

...并且会成功地辞去这份工作。

于 2012-05-01T01:58:40.917 回答
3

通常我使用 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/

于 2012-05-01T01:47:35.463 回答
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;
于 2018-11-09T11:00:00.443 回答