Joby jak wiadomo są sekwencyjne więc nawet jeżeli zrobimy joba i będziemy go uruchamiać co kilka sekund a czas jego wykonania będzie dłuższy to następne wywołanie z harmonogramu zostaną pominięte do czasu aż skończy się poprzednie wywołanie.
Jeżeli przed wywołaniem „joba B” chcemy mieć pewność że „job A” się zakończył, możemy ich uruchomienie włożyć do „jobaC” jako kolejne kroki
Krok 1
EXEC MSDB.DBO.SP_START_JOB @JOB_NAME = 'job A'
Krok 2
EXEC MSDB.DBO.SP_START_JOB @JOB_NAME = 'job B'
Można też w pierwszym kroku „joba B „ sprawdzać czy „job A” działa, procedura w prosty sposób zwraca aktualny stan joba.
CREATE PROC rk_status_job @job_name varchar(200)
as
declare @job_id UNIQUEIDENTIFIER
DECLARE @job_owner sysname
SELECT @job_id =job_id,@job_owner=s.name FROM msdb..sysjobs_view v
INNER JOIN sys.syslogins s
ON v.owner_sid =s.sid
DECLARE @xp_results TABLE (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,
request_source INT NOT NULL,
request_source_id sysname COLLATE database_default NULL,
running INT NOT NULL,
current_step INT NOT NULL,
current_retry_attempt INT NOT NULL,
job_state INT NOT NULL)
INSERT INTO @xp_results
EXECUTE master.dbo.xp_sqlagent_enum_jobs 1,'sa',@job_id
SELECT @job_name job,
status =case running
when 0 then 'Not idle'
when 1 then 'Executing'
when 2 then 'Waiting for thread'
when 3 then 'Between retries'
when 4 then 'Idle'
when 5 then 'Suspended'
when 7 then 'Performing completion actions'
ELSE '???'
END,
running status_id
FROM @xp_results
Wywołanie
EXEC rk_status_job 'job A
--------------------
job status status_id
--------------------------------------- -----------
job A Not idle 0
Można też użyć bardzo dobrej procedury sp_help_job. Ma ona ciekawe możliwości filtrowania jobów i wyświetlania sporej ilości szczegółów n/t stepów. Polecam.
OdpowiedzUsuń@brejk ona korzysta z procedury sp_get_composite_job_info a ta z xp_sqlagent_enum_jobs ;)
OdpowiedzUsuńczyli to samo żródło...
@roku: Wiem, też używam xp_sqlagent_enum_jobs, jeśli tylko sprawdzam statusy jobów, choć nie przepadam za nieudokumentowanymi procedurami :-) Choć ostatnio sp_help_job przydaje mi się bardziej, gdy szukam okazji do optymalizacji (czasy wykonania poszczególnych stepów).
OdpowiedzUsuńdokładnie tak jak ja tylko że procedura na wyjscu ma duzo danych, pisanie tempa za każdym razem mnie denerwowało dlatego zrobilem raz w procedurze, no może dwa bo mam tez funkcję która sprawdza czy dany job jest uruchomiony i wtedy daje if
OdpowiedzUsuń