2012-09-03 12 views
21

एक संग्रहीत प्रक्रिया है जो SQL सर्वर एजेंट जॉब को कॉल करता है और यह लौटाता है कि नौकरी सफलतापूर्वक चल रही है या नहीं।संग्रहीत प्रक्रिया से SQL सर्वर एजेंट जॉब निष्पादित करना और नौकरी परिणाम लौटाना

अब तक मैं

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 

कौन सा काम शुरू होता है, है क्या करता है, तो कार्य सफलतापूर्वक या नहीं भागा वापस पाने के लिए सबसे अच्छा तरीका है?

ठीक है एक संपादन किया गया है और WAITFOR DELAY का उपयोग किया जाता है क्योंकि नौकरी आमतौर पर 4-4 मिनट के बीच कभी नहीं चलती है। क्या नौकरी है लेकिन क्या ऐसा करने का एक और अधिक प्रभावी तरीका है?

उत्तर

19

आप क्वेरी चला सकते हैं:

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

यह एक स्तंभ run_status आरंभ कर देंगे। स्थितियां हैं:

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

अधिक जानकारी पर MSDN

संपादित: आप अपने काम पोल और यकीन है कि यह मार डाला है बनाने के लिए कर सकते हैं। आप यह जानकारी sp_help_job प्रक्रिया से प्राप्त कर सकते हैं। जब यह प्रक्रिया 4 की स्थिति लौटाती है तो इसका मतलब है कि नौकरी निष्क्रिय है। फिर इसकी रन स्थिति की जांच करना सुरक्षित है।

आप नीचे दिए गए कोड का उपयोग कर मतदान कर सकते हैं:

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 

इस कोड, की स्थिति के लिए जाँच करेगा 3 सेकंड के लिए प्रतीक्षा करें और पुन: प्रयास करें। एक बार हमें 4 की स्थिति मिल जाने के बाद हम जानते हैं कि काम पूरा हो गया है और नौकरी के इतिहास की जांच करना सुरक्षित है।

+1

आप संकेत देना चाहते हैं कि मूल रूप से "अंतिम राज्यों" पर सवाल उठने तक आपको मतदान करने की आवश्यकता है। –

+0

तो एक बार जब मैं नौकरी शुरू करता हूं तो मुझे नौकरी खत्म होने तक मतदान करने की आवश्यकता होती है और फिर जॉब इतिहास को निष्पादित किया जाता है? – DtotheG

+0

@ क्रिस्टियनके क्या आप हमें नौकरी एजेंट के लिए मतदान के बारे में कुछ और बता सकते हैं? – testing

19

आप सभी लोग जो कर रहे हैं OPENROWSET आदेश का उपयोग करने के लिए अनुमति नहीं के लिए, यह मदद कर सकता है। मैं यहां अपने समाधान के लिए शुरू पाया:

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

इस तथ्य यह है कि msdb.dbo.sysjobactivity तालिका के कुछ कॉलम पहली नौकरी के बाद एक ही रास्ता या अन्य में खत्म पॉपुलेटेड हो पर निर्भर करता है।

-- 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 

आप कुछ चेक इन करना चाहते हैं कि WHILE-loop को कितनी देर तक चलाने की अनुमति है। मैंने उस भाग को उदाहरण से बाहर रखना चुना। बाहर निकलने के कोड आदि .: http://technet.microsoft.com/en-us/library/ms174997.aspx

0

के लिए

माइक्रोसॉफ्ट मार्गदर्शन मैं थोड़ी देर हो चुकी हो सकता है, लेकिन मैंने पाया कि निम्न क्वेरी मेरे लिए काम किया। यह निष्पादन समय और निष्पादन समाप्ति समय देगा। आप इसे स्थिति पाने के लिए भी बदल सकते हैं।

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 
संबंधित मुद्दे