sql server 中止运行时间超过阈值的作业

USE [msdb]
GO
/****** Object:  StoredProcedure [dbo].[kill_elapsed_job_by_name]    Script Date: 2017/9/26 16:09:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
 CREATE PROCEDURE [dbo].[kill_elapsed_job_by_name]
 (@jobname NVARCHAR(100)='D0400_updateBaseData')
 AS
 -- ============================================= 
 --    Created By: systemadmin 
 --  Created Date: 2017/9/26 15:45:11
 --   Description: dbo.kill_elapsed_job_by_name 
 --   Modified By: 
 -- Modified Date: 
 --      Comments: 
 -- ============================================= 
 BEGIN
 	SET NOCOUNT ON;  
  
 	/*BEGIN TRY*/
 	BEGIN TRY
 		 
 		 	DECLARE @Elapsed INT=0
,@cfg_elapsed INT=0

SELECT 
	@cfg_elapsed=cej.[Elapsed(s)] 
FROM
	cfg_Elapsed_job AS cej WHERE cej.name=@jobname
SELECT  @Elapsed=DATEDIFF(SECOND, activity.run_requested_date, GETDATE())  
FROM 
msdb.dbo.sysjobs_view JOB
JOIN
msdb.dbo.sysjobactivity activity
ON 
JOB.job_id = activity.job_id
JOIN
msdb.dbo.syssessions sess
ON
sess.session_id = activity.session_id
JOIN
(
        SELECT MAX(agent_start_date) AS max_agent_start_date
            FROM
            msdb.dbo.syssessions
) sess_max
ON
sess.agent_start_date = sess_max.max_agent_start_date
WHERE JOB.name =@jobname AND
run_requested_date IS NOT NULL AND stop_execution_date IS NULL

IF @Elapsed>@cfg_elapsed
BEGIN
	
		INSERT INTO log_Elapsed_job
		SELECT JOB.name,JOB.job_id,JOB.originating_server,activity.run_requested_date,
		DATEDIFF(SECOND, activity.run_requested_date, GETDATE()) AS Elapsed, GETDATE() updatedate,'Kill'act

		FROM 
		msdb.dbo.sysjobs_view JOB
		JOIN
		msdb.dbo.sysjobactivity activity
		ON 
		JOB.job_id = activity.job_id
		JOIN
		msdb.dbo.syssessions sess
		ON
		sess.session_id = activity.session_id
		JOIN
		(
				SELECT MAX(agent_start_date) AS max_agent_start_date
					FROM
					msdb.dbo.syssessions
		) sess_max
		ON
		sess.agent_start_date = sess_max.max_agent_start_date
		WHERE JOB.name = @jobname AND
		run_requested_date IS NOT NULL AND stop_execution_date IS NULL
        
		EXEC msdb.dbo.sp_stop_job @jobname
END
ELSE
BEGIN 
	PRINT  'JOb '+@jobname+' ran for  '+cast( @Elapsed  AS NVARCHAR(10))+'s'
END

 		  
 		/*CATCHING @@ERROR*/
 		IF @@ERROR>0
 			 RAISERROR ('Error raised in TRY block.1', 16, 1 );/*[0-10]:CONTINUE;[11-19]:jump to catch*/
 			 
 		 
 	END TRY
 	/*END TRY*/
 	BEGIN CATCH
 		/*DECLARE*/
 		 
 		DECLARE @ErrorMessage        NVARCHAR(4000),
 		        @ErrorSeverity       NVARCHAR(5),
 		        @ErrorState          NVARCHAR(5),
 		        @ERROR_NUMBER        NVARCHAR(5),
 		        @ERROR_LINE          NVARCHAR(5),
 		        @ERROR_PROCEDURE     NVARCHAR(100)	
 		/*SET VALUES*/	
 		SELECT @ErrorMessage = ERROR_MESSAGE(),
 		       @ErrorSeverity       = ERROR_SEVERITY(),
 		       @ErrorState          = ERROR_STATE(),
 		       @ERROR_NUMBER        = ERROR_NUMBER(),
 		       @ERROR_LINE          = ERROR_LINE(),
 		       @ERROR_PROCEDURE     = CASE ISNULL(ERROR_PROCEDURE(), '') WHEN '' THEN '' ELSE  'Error occur when running procedure: ['  + ERROR_PROCEDURE() + '];'   END;
 		/*FORMATING MSG*/	
 		SET @ErrorMessage = @ERROR_PROCEDURE + CHAR(10)
  		    + 'Msg:' + @ErrorMessage + ' Line:' +CAST(@ERROR_LINE AS NVARCHAR)   + ' Number:' +CAST( @ERROR_NUMBER AS nvarchar)
  		    + CHAR(10)
  		    + 'Date:' + CONVERT(NVARCHAR(30), GETDATE(), 120) 
 		/*RAISERROR*/	    
 		RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
 	END CATCH;
 	RETURN 0
 END

GO
/****** Object:  Table [dbo].[cfg_Elapsed_job]    Script Date: 2017/9/26 16:09:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[cfg_Elapsed_job](
	[name] [sysname] NOT NULL,
	[Elapsed(s)] [int] NOT NULL,
	[retry] [int] NOT NULL,
	[update_date] [datetime] NOT NULL
) ON [PRIMARY]

GO
/****** Object:  Table [dbo].[log_Elapsed_job]    Script Date: 2017/9/26 16:09:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[log_Elapsed_job](
	[name] [sysname] NOT NULL,
	[job_id] [uniqueidentifier] NOT NULL,
	[originating_server] [nvarchar](128) NULL,
	[run_requested_date] [datetime] NULL,
	[Elapsed] [int] NULL,
	[updatedate] [datetime] NOT NULL,
	[act] [varchar](4) NOT NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'同步密码和激活状态不一致用户', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D2200_inputDB团队业绩汇总表', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D1731_updateDailyReport', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D0305_1_HR_Excel_192.168.10.101_HR', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D0500_InputDataToOOS_VIP', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D1130_UpdateKPIAlert', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D0300_G_CLASS_override', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'更新POS推进简报', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D0400_updateBaseData', 14400, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'同步OOS基础数据_至正式环境', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'Vika updateMOR040KPI专卖店单产', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'M0300_净水器销售数据', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'LogBackup.Subplan_1', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D1745_UpdateSSAS', 14400, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D2300_Lis_Import_PickCompleteRate', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'SSIS Server Maintenance Job', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D0800_inputData2OOS_SafeStock', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D0400_updateBaseData_bak', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'零配件返还津贴导入', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'patch_refresh_rpt_kpi_t_cal_data_by_month', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D0630_updateReports', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'M0801_UpdateMOR_HR_Import', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'POSbackupPlan.Daily', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'M0300_净水系统上报销售记录月汇总', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'M0800_UpdateMOR', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'W_011500UpdateWr每周捷报', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D1440_update区域周报', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'W0300_净水系统上报销售记录周汇总', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'M0840_导入积分数据', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'D0700_updateMember2016', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'同步OOS基础数据', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'RportDB.Subplan_1', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'W_2300UpdateKPIAlert_WeeklyClear', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[cfg_Elapsed_job] ([name], [Elapsed(s)], [retry], [update_date]) VALUES (N'syspolicy_purge_history', 3600, 1, CAST(0x0000A7FA010272A9 AS DateTime))
INSERT [dbo].[log_Elapsed_job] ([name], [job_id], [originating_server], [run_requested_date], [Elapsed], [updatedate], [act]) VALUES (N'D0400_updateBaseData', N'15afeb74-d96e-40de-904a-4de07909f67c', N'CHN1VRDB03', CAST(0x0000A7FA00FCBB38 AS DateTime), 1897, CAST(0x0000A7FA01056AA6 AS DateTime), N'Kill')

设成作业,每十分钟检索一次

USE [msdb]
GO

/****** Object:  Job [中停超时作业]    Script Date: 2017/9/26 16:11:58 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object:  JobCategory [[Uncategorized (Local)]]]    Script Date: 2017/9/26 16:11:59 ******/
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'中停超时作业', 
		@enabled=1, 
		@notify_level_eventlog=0, 
		@notify_level_email=0, 
		@notify_level_netsend=0, 
		@notify_level_page=0, 
		@delete_level=0, 
		@description=N'无描述。', 
		@category_name=N'[Uncategorized (Local)]', 
		@owner_login_name=N'ukl001', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [中停超时作业]    Script Date: 2017/9/26 16:11:59 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'中停超时作业', 
		@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'exec dbo.[kill_elapsed_job_by_name]  ''D0400_updateBaseData''
go
exec dbo.[kill_elapsed_job_by_name]  ''D1745_UpdateSSAS''
', 
		@database_name=N'msdb', 
		@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'每 10 分钟 执行', 
		@enabled=1, 
		@freq_type=8, 
		@freq_interval=126, 
		@freq_subday_type=4, 
		@freq_subday_interval=10, 
		@freq_relative_interval=0, 
		@freq_recurrence_factor=1, 
		@active_start_date=20170926, 
		@active_end_date=99991231, 
		@active_start_time=0, 
		@active_end_time=235959, 
		@schedule_uid=N'830b0405-1795-4efb-aa7b-980fc0c480e4'
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



猜你喜欢

转载自blog.csdn.net/wangzhpwang/article/details/78099438
今日推荐