我正在尝试创建一个将根据数据库的在线状态运行的作业。比如第1步会检查数据库是否在线;如果数据库在线,它将运行其余步骤,否则,它将报告作业成功。
问问题
28934 次
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 回答