手动运行作业时关闭按钮操作

mlh*_*Dev 6 sql-server sql-server-agent sql-server-2016

我在我的笔记本电脑上使用右键单击 > 在步骤开始工作从 SSMS 开始了一项工作......当我准备好完成当天的工作时,该工作仍在运行,所以我选择关闭,认为它正在服务器上运行,并会继续服务器。

今天我找不到那个运行的工作,所以我第二次猜测这个弹出窗口是如何运行的(下面有问题的弹出窗口的屏幕截图)。

单击关闭按钮时会发生什么?如果作业被终止,它究竟是如何终止的(例如某些可捕获的东西;有问题的作业是在代理帐户下运行的操作系统类型)。

包含有问题的关闭按钮的弹出窗口

Han*_*non 14

“关闭”按钮只是关闭对话框;它并不会停止正在运行的工作。

您可以使用以下存储过程查看给定作业的当前运行时状态

EXEC msdb.dbo.sp_help_jobactivity @job_name = '<job name here>';
Run Code Online (Sandbox Code Playgroud)

为了证明“关闭”按钮实际上并没有停止正在运行的作业,我创建了一个测试作业:

USE [msdb]
GO

BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0

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'TestJob', 
        @enabled=1, 
        @notify_level_eventlog=0, 
        @notify_level_email=0, 
        @notify_level_netsend=0, 
        @notify_level_page=2, 
        @delete_level=0, 
        @description=N'No description available.', 
        @category_name=N'[Uncategorized (Local)]', 
        @owner_login_name=N'sa', 
        @notify_page_operator_name=N'<Operator Name>', @job_id = @jobId OUTPUT;

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Step1', 
        @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'WAITFOR DELAY ''00:00:15'';', 
        @database_name=N'master', 
        @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_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
Run Code Online (Sandbox Code Playgroud)

根据WAITFOR DELAY语句,该作业需要 15 秒才能完成。它什么都不做。

  1. 打开一个新的查询窗口,并向其中添加以下 T-SQL:

    EXEC msdb.dbo.sp_help_jobactivity @job_name = 'TestJob';
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过 SSMS 用户界面运行作业,并立即点击“关闭”按钮。

  3. 通过按 F5 键或单击“执行”按钮运行步骤 1 中的作业活动查询。

将显示作业的状态,例如:

?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????
? session_id ? 工作 ID ? 工作名称?run_requested_date ? run_requested_source ?排队日期?开始执行日期?last_executed_step_id ?last_executed_step_date ?停止执行日期?next_scheduled_run_date ?job_history_id ? 信息 ?运行状态?operator_id_emailed ? operator_id_netsent ? operator_id_paged ?
?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????
? 34156?2BDBF2EA-7E23-447B-A070-97274FFD7EF5?测试工作?2018-01-31 08:51:12.000 ?4 ? 空值 ?2018-01-31 08:51:13.000 ?空值 ?空值 ?空值 ?空值 ?空值 ?空值 ?空值 ?空值 ?空值 ?空值 ?
?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????

在上面的输出中,stop_execution_date列为 NULL,表示作业仍在运行。如果等待 15 秒让作业完成,然后重新运行第 1 步,您将看到输出已更改以反映作业的状态,如下所示:

?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ????????????????????????????????????????????????
? session_id ? 工作 ID ? 工作名称?run_requested_date ? run_requested_source ?排队日期?开始执行日期?last_executed_step_id ?last_executed_step_date ?停止执行日期?next_scheduled_run_date ?job_history_id ? 信息 ?运行状态?operator_id_emailed ? operator_id_netsent ? operator_id_paged ?
?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ????????????????????????????????????????????????
? 34156?2BDBF2EA-7E23-447B-A070-97274FFD7EF5?测试工作?2018-01-31 08:51:12.000 ?4 ? 空值 ?2018-01-31 08:51:13.000 ?1 ? 2018-01-31 08:51:13.000 ?2018-01-31 08:51:28.000 ?空值 ?3514780?作业成功了。作业由用户 me 调用。运行的最后一步是步骤 1 (Step1)。? 1 ? 0 ? 0 ? 0 ?
?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ?????????????????????????????????????????????????????? ????????????????????????????????????????????????

dbo.sp_help_jobactivity存储过程引用dbo.sysjobactivity表。该表的Microsoft文档显示他们使用以下结构来确定作业的当前状态:

CASE
    WHEN sja.start_execution_date IS NULL THEN 'Not running'
    WHEN sja.start_execution_date IS NOT NULL 
        AND sja.stop_execution_date IS NULL THEN 'Running'
    WHEN sja.start_execution_date IS NOT NULL 
        AND sja.stop_execution_date IS NOT NULL THEN 'Not running'
END AS 'RunStatus'
Run Code Online (Sandbox Code Playgroud)