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