TRY / CATCH nie działa na błąd agenta SQL Server?
używamsp_start_job
rozpocząć pracę.
Praca (test2
) ma tylko jeden krok:
select getdate()
waitfor delay '00:00:10'
TheTRY/CATCH
kod:
begin try
EXEC msdb.dbo.sp_start_job @job_name = 'test2'
end try
begin catch
print 'error'
end catch
Pierwsze uruchomienie kodu:
Praca „test2” rozpoczęła się pomyślnie.
Drugi przebieg kodu (w ciągu 10 sekund):
Msg 22022, Level 16, State 1, Line 0
Błąd SQLServerAgent: odrzucono żądanie uruchomienia testu zadania2 (z poziomu użytkownika), ponieważ zadanie jest już uruchomione z żądania użytkownika sa.
DlaczegoTRY/CATCH
nie działa w tym scenariuszu?
AKTUALIZACJA: Na początku powinienem dodać, że pracuję na serwerze sql 2005, który ma połączone serwery (serwer SQL 2000). Próbowałem napisać proc na serwerze SQL Server 2005, aby zobaczyć zadanie na wszystkich połączonych serwerach. Jeśli zadanie nie działa, uruchom je. Początkowo użyłem try-catch i miałem nadzieję złapać każdy błąd, gdy uruchomiłem już uruchomione zadanie, ale nie powiodło się (ten wątek).
W końcu użyłem następującego kodu: (nie skompiluje się, musisz zastąpić niektóre zmienne, po prostu daje pomysł)
CREATE TABLE [dbo].[#jobInfo](
[job_id] [uniqueidentifier] NULL,
[originating_server] [nvarchar](30) ,
[name] [nvarchar](128) ,
[enabled] [tinyint] NULL,
[description] [nvarchar](512) ,
[start_step_id] [int] NULL,
[category] [nvarchar](128) ,
[owner] [nvarchar](128) ,
[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) ,
[notify_netsend_operator] [nvarchar](128) ,
[notify_page_operator] [nvarchar](128) ,
[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) ,
[current_retry_attempt] [int] NOT NULL,
[has_step] [int] NULL,
[has_schedule] [int] NULL,
[has_target] [int] NULL,
[type] [int] NOT NULL
)
SET @sql =
'INSERT INTO #jobInfo
SELECT * FROM OPENQUERY( [' + @srvName + '],''set fmtonly off exec msdb.dbo.sp_help_job'')'
EXEC(@sql)
IF EXISTS (select * from #jobInfo WHERE [name] = @jobName AND current_execution_status IN (4,5)) -- 4: idle, 5: suspended
BEGIN
SET @sql = 'EXEC [' + @srvName + '].msdb.dbo.sp_start_job @job_name = ''' + @jobName + ''''
--print @sql
EXEC (@sql)
INSERT INTO #result (srvName ,status ) VALUES (@srvName, 'Job started.')
END ELSE BEGIN
INSERT INTO #result (srvName ,status ) VALUES (@srvName, 'Job is running already. No action taken.')
END