SQL计划作业


计划作业是开发的一部分,可以是任何应用程序。当库存应用程序实现几乎所有操作的自动化时,对它们的需求最大。当查询需要根据需要定期运行和更新(或插入-或任何类似的操作)时,SQL作业可以证明是很方便的。这些类似于跟踪您的提醒和更新的计划程序。
根据MSDN

SQL Server代理是一项Microsoft Windows服务,可执行计划的管理任务,在SQL Server 2016中称为作业。

SQL作业由SQL Server代理运行。它可以是在后台运行的单个操作,也可以是一系列操作。可以使用SQL Server提供的GUI添加SQL作业。但是,在本文中,我们将看到并理解帮助创建SQL作业的查询。这些作业可以安排为每天、每周或每月运行。

直奔主题

我们将立即看一看这段代码,然后尝试理解其中的一部分。

BEGIN TRANSACTION;
DECLARE @ReturnCode INT;
SELECT @ReturnCode = 0;
DECLARE @owner_Login_Id NVARCHAR(30), 
        @actual_database_name NVARCHAR(30);
SET @owner_Login_Id = N''; -- ADD THE LOGIN NAME TO THE SERVER
SET @actual_database_name = N'DB NAME'; -- ADD THE DATABASE NAME AS REQUIRED

IF NOT EXISTS( SELECT name
               FROM msdb.dbo.syscategories
               WHERE name = N'[Uncategorized (Local)]'
                 AND category_class = 1 )
    BEGIN
        EXEC @ReturnCode = msdb.dbo.sp_add_category
             @class = N'JOB',
             @type = N'LOCAL',
             @name = N'[Uncategorized (Local)]';
        IF( @@ERROR <> 0
         OR @ReturnCode <> 0
          )
        GOTO QuitWithRollback;
    END;
DECLARE @jobId BINARY(16);
EXEC @ReturnCode = msdb.dbo.sp_add_job
     @job_name = N'JOB_NAME',
     @enabled = 1,
     @notify_level_eventlog = 0,
     @notify_level_email = 0,
     @notify_level_netsend = 0,
     @notify_level_page = 0,
     @delete_level = 0,
     @description = N'JOB_DESCRIPTION',
     @category_name = N'[Uncategorized (Local)]',
     @owner_login_name = @owner_Login_Id,
     @job_id = @jobId OUTPUT;
IF( @@ERROR <> 0
 OR @ReturnCode <> 0
  )
GOTO QuitWithRollback;

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep
     @job_id = @jobId,//-- ID of the Job created
     @step_name = N'STEP_NAME', //--Step Name for the JOB
     @step_id = 1,
     @cmdexec_success_code = 0,
     @on_success_action = 1,
     @on_success_step_id = 0,
     @on_fail_action = 2,
     @on_fail_step_id = 0,
     @retry_attempts = 0,
     @retry_interval = 0,
     @os_run_priority = 0,
     @subsystem = N'TSQL',
     @command = N'YOUR QUERY GOES HERE',
     @database_name = @actual_database_name, //--Database name is generic and defined above at the start
     @flags = 0;
IF( @@ERROR <> 0
 OR @ReturnCode <> 0
  )
GOTO QuitWithRollback;
EXEC @ReturnCode = msdb.dbo.sp_update_job
     @job_id = @jobId,
     @start_step_id = 1;
IF( @@ERROR <> 0
 OR @ReturnCode <> 0
  )
GOTO QuitWithRollback;
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule
     @job_id = @jobId,
     @name = N'JOB_SCHEDULE_NAME',
     @enabled = 1,
     @freq_type = 4,
     @freq_interval = 1,
     @freq_subday_type = 1,
     @freq_subday_interval = 0,
     @freq_relative_interval = 0,
     @freq_recurrence_factor = 0,
     @active_start_date = 20150615,
     @active_end_date = 99991231,
     @active_start_time = 0,
     @active_end_time = 235959,
     @schedule_uid = N'af82656c-e151-4ebb-9fe1-009495e1415d';
IF( @@ERROR <> 0
 OR @ReturnCode <> 0
  )
GOTO QuitWithRollback;
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver
     @job_id = @jobId,
     @server_name = N'(local)';
IF( @@ERROR <> 0
 OR @ReturnCode <> 0
  )
GOTO QuitWithRollback;
COMMIT TRANSACTION;
GOTO EndSave;
QuitWithRollback:
IF( @@TRANCOUNT > 0 )
ROLLBACK TRANSACTION;
EndSave:
GO

代码段第9-12行导致局部类别的存在。它的作用很简单。

发件人MSDN

现在,在检查之后,如果存在管理组织作业的类别,则会执行添加新类别的预定义存储过程SP_ADD_CATEGORY

sp_add_category 
     [ [ @class = ] 'class', ] 
     [ [ @type = ] 'type', ] 
     { [ @name = ] 'name' }
  • @class:class控制类,即可以是JOB|ALERT|OPERATOR
  • @type:指定作业的类型或位置,即LOCAL|MULTI-SERVER|NONE
  • @Name:要添加的类别名称

在此之后,执行作业添加SP。需要知道SP的参数以及添加这些参数的原因。了解更多信息MSDN都可以跟上。

此SP sp_add_job简单且仅添加具有指定名称的作业。为了执行作业并让它执行所需的流程,我们需要添加一个作业步骤,该步骤是接下来创建的。
sp_add_jobstep为我们做这项工作。此SP添加要在该作业下执行或运行的特定步骤。这里的参数也可以参考MSDN

@command是这里最重要的参数,因为将以一定的间隔实际执行并满足您的需求的查询将会运行。

@database_name也很重要,因为这将指定作业将在哪个数据库上执行查询。

然后,我们使用SP sp_add_jobSchedule为创建的作业添加计划。此SP为作业添加所需的计划,并将作业设置为根据该计划运行。请参阅MSDN了解更多信息和参数定义。

结论

就是这样,伙计们。我们已经看到,一旦运行简单的查询,就会为我们创建一个SQL作业,该作业实际上可以在后台执行任何查询,从而使工作变得轻松。

兴趣点

我们跟踪了查询中的事务以跟踪错误,如果有任何错误导致,我们可以回滚更改以避免歧义。

现在不必遵循使用SQL Server对象资源管理器创建作业的步骤,只需运行上面的查询,了解参数一次,然后就很容易了。

希望这能帮上忙。