SQL 2005 Agent Job Status Provider

Microsoft.SQLServer.2005.AgentJobStatus (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsMicrosoft.SQLServer.SQLProbeAccount
OutputTypeSystem.PropertyBagData

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Windows.TimedScript.PropertyBagProvider Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
IntervalSecondsint$Config/IntervalSeconds$Frequency (seconds)
SyncTimestring$Config/SyncTime$Synchronization Time
TimeoutSecondsint$Config/TimeoutSeconds$

Source Code:

<DataSourceModuleType ID="Microsoft.SQLServer.2005.AgentJobStatus" Accessibility="Internal" RunAs="SQL!Microsoft.SQLServer.SQLProbeAccount">
<Configuration>
<xsd:element name="IntervalSeconds" type="xsd:integer"/>
<xsd:element name="SyncTime" type="xsd:string"/>
<xsd:element name="ConnectionString" type="xsd:string"/>
<xsd:element name="TimeoutSeconds" type="xsd:int"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" ParameterType="int" Selector="$Config/IntervalSeconds$"/>
<OverrideableParameter ID="SyncTime" ParameterType="string" Selector="$Config/SyncTime$"/>
<OverrideableParameter ID="TimeoutSeconds" ParameterType="int" Selector="$Config/TimeoutSeconds$"/>
</OverrideableParameters>
<ModuleImplementation>
<Composite>
<MemberModules>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.PropertyBagProvider">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime>$Config/SyncTime$</SyncTime>
<ScriptName>GetSQL2005AgentJobStatus.vbs</ScriptName>
<Arguments>$Config/ConnectionString$</Arguments>
<ScriptBody><Script>

'Copyright (c) Microsoft Corporation. All rights reserved.
Option Explicit
SetLocale("en-us")

Dim SCRIPT_SQL

SCRIPT_SQL = "SET NOCOUNT ON" &amp; VbCrLf &amp;_
"DECLARE @job_activity TABLE (" &amp; VbCrLf &amp;_
"[session_id] [int] NOT NULL," &amp; VbCrLf &amp;_
"[job_id] [uniqueidentifier] NOT NULL," &amp; VbCrLf &amp;_
"[job_name] [sysname] COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL," &amp; VbCrLf &amp;_
"[run_requested_date] [datetime] NULL," &amp; VbCrLf &amp;_
"[run_requested_source] [sysname] COLLATE SQL_Latin1_General_CP1_CS_AS NULL," &amp; VbCrLf &amp;_
"[queued_date] [datetime] NULL," &amp; VbCrLf &amp;_
"[start_execution_date] [datetime] NULL," &amp; VbCrLf &amp;_
"[last_executed_step_id] [int] NULL," &amp; VbCrLf &amp;_
"[last_exectued_step_date] [datetime] NULL," &amp; VbCrLf &amp;_
"[stop_execution_date] [datetime] NULL," &amp; VbCrLf &amp;_
"[next_scheduled_run_date] [datetime] NULL," &amp; VbCrLf &amp;_
"[job_history_id] [int] NULL," &amp; VbCrLf &amp;_
"[message] [nvarchar](1024) COLLATE SQL_Latin1_General_CP1_CS_AS NULL," &amp; VbCrLf &amp;_
"[run_status] [int] NULL," &amp; VbCrLf &amp;_
"[operator_id_emailed] [int] NULL," &amp; VbCrLf &amp;_
"[operator_id_netsent] [int] NULL," &amp; VbCrLf &amp;_
"[operator_id_paged] [int] NULL," &amp; VbCrLf &amp;_
"[execution_time_minutes] [int] NULL )" &amp; VbCrLf &amp;_
"INSERT INTO @job_activity" &amp; VbCrLf &amp;_
"([session_id]" &amp; VbCrLf &amp;_
",[job_id]" &amp; VbCrLf &amp;_
",[job_name]" &amp; VbCrLf &amp;_
",[run_requested_date]" &amp; VbCrLf &amp;_
",[run_requested_source]" &amp; VbCrLf &amp;_
",[queued_date]" &amp; VbCrLf &amp;_
",[start_execution_date]" &amp; VbCrLf &amp;_
",[last_executed_step_id]" &amp; VbCrLf &amp;_
",[last_exectued_step_date]" &amp; VbCrLf &amp;_
",[stop_execution_date]" &amp; VbCrLf &amp;_
",[next_scheduled_run_date]" &amp; VbCrLf &amp;_
",[job_history_id]" &amp; VbCrLf &amp;_
",[message]" &amp; VbCrLf &amp;_
",[run_status]" &amp; VbCrLf &amp;_
",[operator_id_emailed]" &amp; VbCrLf &amp;_
",[operator_id_netsent]" &amp; VbCrLf &amp;_
",[operator_id_paged])" &amp; VbCrLf &amp;_
"EXECUTE [msdb].[dbo].[sp_help_jobactivity]" &amp; VbCrLf &amp;_
"SELECT" &amp; VbCrLf &amp;_
"[ja].[job_id]" &amp; VbCrLf &amp;_
",[ja].[job_name]" &amp; VbCrLf &amp;_
",[originating_server]" &amp; VbCrLf &amp;_
",[message]" &amp; VbCrLf &amp;_
",[run_status]" &amp; VbCrLf &amp;_
", [execution_time_minutes] = case" &amp; VbCrLf &amp;_
" -- Has not finished a run" &amp; VbCrLf &amp;_
" When [start_execution_date] is not null And [stop_execution_date] is null" &amp; VbCrLf &amp;_
" Then DATEDIFF(minute, [start_execution_date], GETDATE())" &amp; VbCrLf &amp;_
" -- Has finished that run, but we still need to time for monitor state" &amp; VbCrLf &amp;_
" When [start_execution_date] is not null and [stop_execution_date] is not null" &amp; VbCrLf &amp;_
" Then DATEDIFF(minute, [start_execution_date], [stop_execution_date])" &amp; VbCrLf &amp;_
" else null" &amp; VbCrLf &amp;_
"End" &amp; VbCrLf &amp;_
" " &amp; VbCrLf &amp;_
"FROM @job_activity [ja]" &amp; VbCrLf &amp;_
"JOIN [msdb].[dbo].[sysjobs_view] [sjv] ON [sjv].[job_id] = [ja].[job_id]"



'Start of Main
'-----------------------------------------------------------------------------------------------
call Main()

Sub Main()

Dim objParameters, sConnectionString
Dim oAPI, oBag

Set objParameters = WScript.Arguments

If objParameters.Count &lt;&gt; 1 Then
Quit()
End If

sConnectionString= objParameters(0)

Set objParameters = Nothing

Set oAPI = MOMCreateObject("MOM.ScriptAPI")
Set oBag = oAPI.CreatePropertyBag()

If GetJobStatus(oBag, sConnectionString) = 0 Then
Call oAPI.Return(oBag)
Else
Quit()
End If

End Sub
'End of Main
'-----------------------------------------------------------------------------------------------


Function Quit()
WScript.Quit()
End Function

Class Error
Private m_lNumber
Private m_sSource
Private m_sDescription
Private m_sHelpContext
Private m_sHelpFile
Public Sub Save()
m_lNumber = Err.number
m_sSource = Err.Source
m_sDescription = Err.Description
m_sHelpContext = Err.HelpContext
m_sHelpFile = Err.helpfile
End Sub
Public Sub Raise()
Err.Raise m_lNumber, m_sSource, m_sDescription, m_sHelpFile, m_sHelpContext
End Sub
Public Sub Clear()
m_lNumber = 0
m_sSource = ""
m_sDescription = ""
m_sHelpContext = ""
m_sHelpFile = ""
End Sub
Public Default Property Get Number()
Number = m_lNumber
End Property
Public Property Get Source()
Source = m_sSource
End Property
Public Property Get Description()
Description = m_sDescription
End Property
Public Property Get HelpContext()
HelpContext = m_sHelpContext
End Property
Public Property Get HelpFile()
HelpFile = m_sHelpFile
End Property
End Class


Function MomCreateObject(ByVal sProgramId)
Dim oError
Set oError = New Error

On Error Resume Next
Set MomCreateObject = CreateObject(sProgramId)
oError.Save
On Error Goto 0

If oError.Number &lt;&gt; 0 Then ThrowScriptError "Unable to create automation object '" &amp; sProgramId &amp; "'", oError
End Function


Function ThrowScriptError(Byval sMessage, ByVal oErr)
On Error Resume Next
Dim oAPITemp
Set oAPITemp = MOMCreateObject("MOM.ScriptAPI")
oAPITemp.LogScriptEvent "GetSQL2005AgentJobStatus.vbs", 4000, 1, sMessage &amp; ". " &amp; oErr.m_sDescription
Quit()
End Function

Function GetJobStatus (ByRef oBag, ByVal sConnectionString)


Dim cnADOConnection
Dim strProv
Dim rsSQLJobs
Dim bFail
Dim nDuration
Dim jobID
Dim lastStatus
Dim lastMessage


'on error resume next

Set cnADOConnection = MomCreateObject("ADODB.Connection")
cnADOConnection.Provider = "sqloledb"
cnADOConnection.ConnectionTimeout = 30
strProv = "Server=" &amp; sConnectionString &amp; ";Database=msdb;Trusted_Connection=yes"

Err.Clear
cnADOConnection.Open strProv
if 0 &lt;&gt; Err.number then
' Throw
Exit Function
end if


Err.Clear
Set rsSQLJobs = cnADOConnection.Execute(SCRIPT_SQL)
If 0 &lt;&gt; Err.number Then
' Throw
Exit Function
End If

If 0 = rsSQLJobs.State Then
' No records returned, recordset is likely closed.
Exit Function
End If

Do
bFail = True
Err.Clear
if rsSQLJobs.EOF then
if 0 &lt;&gt; Err.number then Exit Do
bFail = False
Exit Do
End If
If 0 &lt;&gt; Err.number Then Exit Do
jobID = rsSQLJobs("job_id").Value
lastStatus = rsSQLJobs("run_status").Value
lastMessage = rsSQLJobs("message").Value
nDuration = Int(rsSQLJobs("execution_time_minutes").Value)
If (IsNull(nDuration)) Then nDuration = -1
If (IsNull(lastStatus)) Then lastStatus = -1
If (IsNull(lastMessage)) Then lastMessage = ""
Call oBag.AddValue(jobID &amp; "-Duration",CDbl(nDuration))
Call oBag.AddValue(jobID &amp; "-LastStatus", CInt(lastStatus))
Call oBag.AddValue(jobID &amp; "-LastMessage", CStr(lastMessage))

Err.Clear
rsSQLJobs.MoveNext
If 0 &lt;&gt; Err.number then Exit Do
Loop



If bFail Then
' Throw
End if

Set cnADOConnection = Nothing
Set rsSQLJobs = Nothing


GetJobStatus = 0

End Function

</Script></ScriptBody>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</DataSource>
</MemberModules>
<Composition>
<Node ID="DS"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.PropertyBagData</OutputType>
</DataSourceModuleType>