Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Из одной job проверить не активна ли другая job (sp_help_job)  [new]
_dodgy_
Member

Откуда:
Сообщений: 108
Кажется задача не имеет решения, но всё-таки спрошу. Первым шагом в First Job должна быть проверка того что неактивна Second Job, если активна, то завершить работу First Job (она каждые 15 минут начинает новый цикл). Для завершения используется "SELECT 1/0" - несколько грубовато, но работает.

DECLARE @current_execution_status int
BEGIN TRY
	
		DECLARE @JobInfo TABLE (
			[job_id] [uniqueidentifier] NULL,
			[originating_server] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
			[name] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
			[enabled] [tinyint] NULL,
			[description] [nvarchar](512) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
			[start_step_id] [int] NULL,
			[category] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
			[owner] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
			[notify_level_eventlog] [int] NULL,
			[notify_level_email] [int] NULL,
			[notify_level_netsend] [int] NULL,
			[notify_level_page] [int] NULL,
			[notify_email_operator] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
			[notify_netsend_operator] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
			[notify_page_operator] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
			[delete_level] [int] NULL,
			[date_created] [datetime] NULL,
			[date_modified] [datetime] NULL,
			[version_number] [int] NULL,
			[last_run_date] [int] NOT NULL,
			[last_run_time] [int] NOT NULL,
			[last_run_outcome] [int] NOT NULL,
			[next_run_date] [int] NOT NULL,
			[next_run_time] [int] NOT NULL,
			[next_run_schedule_id] [int] NOT NULL,
			[current_execution_status] [int] NOT NULL,
			[current_execution_step] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
			[current_retry_attempt] [int] NOT NULL,
			[has_step] [int] NULL,
			[has_schedule] [int] NULL,
			[has_target] [int] NULL,
			[type] [int] NOT NULL
		)


		INSERT @JobInfo
		EXEC sp_help_job @job_name = 'Second Job Name', @job_aspect = 'JOB'

		SELECT @current_execution_status = [current_execution_status] FROM @JobInfo
		SELECT * FROM @JobInfo -- doesn't return any rows

END TRY
BEGIN CATCH
	
END CATCH

SELECT @current_execution_status -- returns NULL

IF (SELECT [current_execution_status] FROM @JobInfo)=1 BEGIN
	SELECT 1/0 -- fail job step and to prevent next execution
END ELSE BEGIN
	SELECT 0/1 -- continue
END

Проблема в том что вот этот код:
INSERT @JobInfo
EXEC sp_help_job @job_name = 'Second Job Name', @job_aspect = 'JOB'
всегда выдаёт эту ошибку:
Msg 8164, Level 16, State 1, Procedure sp_get_composite_job_info, Line 72
An INSERT EXEC statement cannot be nested.

Валится даже не успевая внести строчку во временную талицу. Можно ошибку не подавлять с помощью TRY ... CATCH, тогда строчка вставляется и статус Second Job узнать можно. Но сам факт появления этой ошибки уже завершает с ошибкой первый шаг работы First Job и соответственно её цикл не продолжится никогда. В общем требуется подавить первую ошибку и в зависимости от результата проверки вызвать ошибку деления на ноль. Возможно?
6 июн 11, 06:12    [10766920]     Ответить | Цитировать Сообщить модератору
 Re: Из одной job проверить не активна ли другая job (sp_help_job)  [new]
aleks2
Guest
А просто заглянуть в sp_help_job и помозговать как она определяет статус JOBa?
А затем незатейливо повторить фокус самостоятельно?
Не?
6 июн 11, 07:30    [10766981]     Ответить | Цитировать Сообщить модератору
 Re: Из одной job проверить не активна ли другая job (sp_help_job)  [new]
_dodgy_
Member

Откуда:
Сообщений: 108
aleks2
А просто заглянуть в sp_help_job и помозговать как она определяет статус JOBa?
А затем незатейливо повторить фокус самостоятельно?
Не?

Думал, муторно это - там много системных таблиц переплетается (до 4-х кажется). В принципе как вариант сойдёт.

В любом случае пост про подавление сообщений об ошибках. Кажется это невозможно.
6 июн 11, 10:08    [10767503]     Ответить | Цитировать Сообщить модератору
 Re: Из одной job проверить не активна ли другая job (sp_help_job)  [new]
GlebZ
Member

Откуда: USA
Сообщений: 286
А жизнь вообще муторная штука.....
Пользуйтесь (я, видимо, тоже у кого-то спер):
USE [msdb]
GO
/****** Object:  StoredProcedure [usp_GetJobExecutionStatus]    Script Date: 06/06/2011 09:48:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROC [usp_GetJobExecutionStatus]
@jname sysname 
AS
SET NOCOUNT ON
DECLARE @is_sysadmin INT
  DECLARE @job_owner   sysname
DECLARE @Ret INT
DECLARE @job_state nvarchar(50)



  CREATE TABLE #xp_results (job_id                UNIQUEIDENTIFIER NOT NULL,
                            last_run_date         INT              NOT NULL,
                            last_run_time         INT              NOT NULL,
                            next_run_date         INT              NOT NULL,
                            next_run_time         INT              NOT NULL,
                            next_run_schedule_id  INT              NOT NULL,
                            requested_to_run      INT              NOT NULL, -- BOOL
                            request_source        INT              NOT NULL,
                            request_source_id     sysname          NULL,
       running               INT              NOT NULL, -- BOOL
                            current_step          INT              NOT NULL,
                            current_retry_attempt INT              NOT NULL,
                            job_state             INT              NOT NULL)

  SELECT @is_sysadmin = ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0)
  SELECT @job_owner = SUSER_SNAME()

  INSERT INTO #xp_results
  EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner
IF @jname IS NULL 
	BEGIN
	SELECT sj.Name,xpr.job_state,
	case xpr.job_state 
		WHEN  0 THEN 'Not idle or suspended'
		WHEN  1 THEN 'Executing'
		WHEN  2 THEN 'Waiting For Thread'
		WHEN  3 THEN 'Between Retries'
		WHEN  4 THEN 'Idle'
		WHEN  5 THEN 'Suspended'
		WHEN  6 THEN 'WaitingForStepToFinish'
		WHEN  7 THEN 'PerformingCompletionActions'
		ELSE 'Unknown'  
	END AS 'Status'
	FROM  #xp_results xpr
	INNER JOIN sysjobs sj on xpr.job_id = sj.job_id
	set @ret =  0
END
ELSE
BEGIN	
	SELECT @Ret=xpr.job_state,
	@job_state =case xpr.job_state 
		WHEN  0 THEN 'Not idle or suspended'
		WHEN  1 THEN 'Executing'
		WHEN  2 THEN 'Waiting For Thread'
		WHEN  3 THEN 'Between Retries'
		WHEN  4 THEN 'Idle'
		WHEN  5 THEN 'Suspended'
		WHEN  6 THEN 'WaitingForStepToFinish'
		WHEN  7 THEN 'PerformingCompletionActions'
		ELSE 'Unknown'  
	END
	FROM  #xp_results xpr
	INNER JOIN sysjobs sj on xpr.job_id = sj.job_id
	WHERE  sj.name = @jname
	
	SELECT @jname AS 'Name',@Ret AS job_state,@job_state AS 'Status'
END
	
 -- Clean up
  DROP TABLE #xp_results
return @ret	 
6 июн 11, 17:53    [10772336]     Ответить | Цитировать Сообщить модератору
 Re: Из одной job проверить не активна ли другая job (sp_help_job)  [new]
_dodgy_
Member

Откуда:
Сообщений: 108
GlebZ,

Большое спасибо!
7 июн 11, 03:31    [10774191]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить