2012-09-03 11 views
21

Need dönüyor.bir saklı yordam SQL Server aracısı Job yürütülmesi ve bir SQL Server Agent Job ve işinin başarıyla ya da değil koştu olsun veya olmasın döner çağıran bir saklı yordam var iş bir sonuç

Şimdiye kadar işi başlatır

CREATE PROCEDURE MonthlyData 
AS 
EXEC msdb.dbo.sp_start_job N'MonthlyData' 

WAITFOR DELAY '000:04:00' 

EXEC msdb.dbo.sp_help_jobhistory @job_name = 'MonthlyData' 
GO 


, whats işinin başarıyla ya da değil kaçsam geri almanın en iyi yolu?

Tamam bir düzenleme yapılmış ve iş normalde asla uzun 4'ten 3-4 dakika arasında çalışan iş yok ama bunu yapmak için daha etkili bir yol olarak BEKLE DELAY kullanılan?

cevap

19

Sen sorguyu çalıştırabilirsiniz:

EXEC msdb.dbo.sp_help_jobhistory 
    @job_name = N'MonthlyData' 

Bir sütun run_status dönersiniz. Durumlar şunlardır:

0 - Failed 
1 - Succeeded 
2 - Retry 
3 - Canceled   

diğer bilgiler DÜZENLEME

MSDN tarih: İşini anket ve idam emin olmak için isteyebilirsiniz. Bu bilgiyi sp_help_job prosedüründen alabilirsiniz. Bu yordam 4 durumunu döndürdüğünde, bu iş boşta demektir. O zaman bunun durumunu çalıştırıldığı kontrol etmek için güvenlidir.

Aşağıdaki kodu kullanarak yoklamak:

DECLARE @job_status INT 
SELECT @job_status = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=.;Trusted_Connection=yes;','exec msdb.dbo.sp_help_job @job_name = ''NightlyBackups''') 

WHILE @job_status <> 4 
BEGIN 
    WAITFOR DELAY '00:00:03' 
    SELECT @job_status = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=.;Trusted_Connection=yes;','exec msdb.dbo.sp_help_job @job_name = ''NightlyBackups''') 
END 

EXEC msdb.dbo.sp_help_jobhistory 
    @job_name = N'NightlyBackups' ; 
GO 

Bu kod 3 saniye bekleyin ve tekrar deneyin, durumu kontrol edecektir. 4 durumu aldığımızda, işin bittiğini ve iş geçmişini kontrol etmenin güvenli olduğunu biliyoruz. openrowset komutunu kullanmak izin verilmez tüm çocuklar için

+1

Söz konusu iş "son durum" a ulaşıncaya kadar temel olarak yoklamaya gerek olduğunu belirtmek isteyebilirsiniz. –

+0

Ben de o zaman iş daha sonra bitmiş jobhistory exec kadar yoklamak gerekir görevlerine başladığında? – DtotheG

+0

@ChristianK Bize İş Agent için yoklama hakkında daha fazla şey söyleyebilir misiniz? – testing

19

, bu yardımcı olabilir. Benim burada çözüm için bir başlangıç ​​bulundu:

Bu iş şu veya bu şekilde bitmesine msdb.dbo.sysjobactivity tablonun bazı sütunlar ilk doldurulan gerçeğine dayanır

http://social.msdn.microsoft.com/Forums/en-US/89659729-fea8-4df0-8057-79e0a437b658/dynamically-checking-job-status-with-tsql

.

-- Start job 
DECLARE @job_name NVARCHAR(MAX) = 'JobName' 
EXEC msdb.dbo.sp_start_job @job_name = @job_name 


-- Wait for job to finish 
DECLARE @job_history_id AS INT = NULL 

WHILE @time_constraint = @ok 
BEGIN 
    SELECT TOP 1 @job_history_id = activity.job_history_id 
    FROM msdb.dbo.sysjobs jobs 
    INNER JOIN msdb.dbo.sysjobactivity activity ON activity.job_id = jobs.job_id 
    WHERE jobs.name = @job_name 
    ORDER BY activity.start_execution_date DESC 

    IF @job_history_id IS NULL 
    BEGIN 
     WAITFOR DELAY '00:00:10' 
     CONTINUE 
    END 
    ELSE 
     BREAK 
END 


-- Check exit code 
SELECT history.run_status 
FROM msdb.dbo.sysjobhistory history 
WHERE history.instance_id = @job_history_id 

Sen WHILE döngü çalışmasına izin ne kadar süre için bazı kontroller koymak isteyebilirsiniz. Bu kısmı örnek dışında tutmayı seçtim. çıkış kodları vb .: http://technet.microsoft.com/en-us/library/ms174997.aspx

0

için

Microsoft rehberlik ben biraz geç olabilir ama aşağıdaki sorgu benim için çalıştı bulundu. Uygulama zamanı ve yürütme bitiş zamanı verecektir. Durumu almak için bunu değiştirebilirsiniz.

SELECT 
    job.name, 
    job.job_id, 
    job.originating_server, 
    activity.run_requested_date, 
    activity.stop_execution_date, 
    DATEDIFF(SECOND, activity.run_requested_date, activity.stop_execution_date) as Elapsed 
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 run_requested_date IS NOT NULL 
--AND stop_execution_date IS NULL 
AND job.name = @JobName