Powiel możliwe:
Executing SQL Server Agent Job from a stored procedure and returning job resultsp_start_job czekać na zadanie dokończyć
Czy istnieje sposób, aby określić, kiedy zadanie agenta SQL jak skończył raz został rozpoczęty z sp_start_job?
Powiel możliwe:
Executing SQL Server Agent Job from a stored procedure and returning job resultsp_start_job czekać na zadanie dokończyć
Czy istnieje sposób, aby określić, kiedy zadanie agenta SQL jak skończył raz został rozpoczęty z sp_start_job?
XP_SQLAGENT_ENUM_JOBS
może być używany, ale nieudokumentowane. Zazwyczaj służy do wykrywania długotrwałych zadań.
Oczywiście, istnieje również sp_help_jobs
lub po prostu monitorowania pracy ubiegła
I rzeczywiście miał to zrobić niedawno, a to, jak myślę o jego realizacji. Tworzę tymczasową pracę za pośrednictwem sp_add_job i sp_add_jobstep, a ustawienie @delete_level na 3 (zawsze usuwaj po uruchomieniu).
Nie jestem w 100% sprzedawany na takie podejście, jak prawdopodobnie można powiedzieć z tytułu procedury przechowywanej. Jednak to działa:
CREATE PROCEDURE spWorkaround_checkJobExists
@job_id UNIQUEIDENTIFIER
, @thisIteration tinyint
, @maxRecurse tinyint
AS
IF (@thisIteration <= @maxRecurse)
BEGIN
IF EXISTS(
select * FROM msdb.dbo.sysjobs where job_id = @job_id
)
BEGIN
WAITFOR DELAY '00:00:01'
DECLARE @nextIteration int
SET @nextIteration = @thisIteration + 1
EXEC dbo.spWorkaround_checkJobExists @job_id, @nextIteration, @maxRecurse
END
END
Oczywiście, będziemy chcieli, aby umieścić w jakimś kodem, aby zapewnić, że istnieje maksymalna ilość razy to będzie recurse, ale masz pomysł. Można również przekazać parametr, aby kontrolować częstotliwość pojawiania się rekurencji. W moim przypadku, po dziesięciu sekundach, wyniki są bez znaczenia.
To, co tu robię, może być modyfikowane dla zadań, które nie powinny zostać upuszczone natychmiast po wykonaniu, zmieniając kryteria wyboru w celu sprawdzenia statusu wykonania zadania, na przykład: sp_help_job przekazuje @job_name lub @ job_id i @execution_status = 0.
sp_help_job @job_name @execution_status = 0
Ten article opisuje SP, aby uruchomić zadanie agenta SQL i czekać.
-- output from stored procedure xp_sqlagent_enum_jobs is captured in the following table
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, -- BOOL
request_source INT NOT NULL,
request_source_id sysname COLLATE database_default NULL,
running INT NOT NULL, -- BOOL
current_step INT NOT NULL,
current_retry_attempt INT NOT NULL,
job_state INT NOT NULL)
-- start the job
declare @r as int
exec @r = msdb..sp_start_job @job
-- quit if unable to start
if @r<>0
RAISERROR (N'Could not start job: %s.', 16, 2, @job)
-- start with an initial delay to allow the job to appear in the job list (maybe I am missing something ?)
WAITFOR DELAY '0:0:01';
set @seccount = 1
-- check job run state
insert into @xp_results
execute master.dbo.xp_sqlagent_enum_jobs 1, @job_owner, @job_id
set @running= (SELECT top 1 running from @xp_results)
while @running<>0
begin
WAITFOR DELAY '0:0:01';
set @seccount = @seccount + 1
delete from @xp_results
insert into @xp_results
execute master.dbo.xp_sqlagent_enum_jobs 1, @job_owner, @job_id
set @running= (SELECT top 1 running from @xp_results)
end
-- result: not ok (=1) if still running
if @running <> 0 begin
-- still running
return 0
end
else begin
-- did it finish ok ?
set @run_status = 0
select @run_status=run_status
from msdb.dbo.sysjobhistory
where [email protected]_id
and cast(run_date as bigint) * 1000000 + run_time >= @start_job
if @run_status=1
return 1 --finished ok
else --error
RAISERROR (N'job %s did not finish successfully.', 16, 2, @job)
end
END TRY
Ten artykuł pomógł mi, w każdym razie ... – topwik
SELECT TOP 1 1 AS FinishedRunning
FROM msdb..sysjobactivity aj
JOIN msdb..sysjobs sj on sj.job_id = aj.job_id
WHERE aj.stop_execution_date IS NOT NULL
AND aj.start_execution_date IS NOT NULL
AND sj.name = 'YourJobNameHere'
AND NOT EXISTS
(
SELECT TOP 1 1
FROM msdb..sysjobactivity New
WHERE New.job_id = aj.job_id
AND new.start_execution_date > aj.start_execution_date
)
wolałbym pozostać w udokumentowanej ziemi. Jestem świadomy sp_help_jobs, jednak jest to trochę brzydkie, ponieważ, z mojego zrozumienia, muszę odczytać zestaw wyników do tabeli tymczasowej, a następnie wybrać z tego. Szukałem czegoś trochę czystszego, chociaż to by działało. –