2017-06-02 95 views
0

我想檢查一個SQL作業當前是否正在運行。 「run_status」列是否正確檢查?有沒有更簡單的方法做到這一點,而不必循環通過每列?檢查SQL Server作業的狀態

public int CheckAgentJob(string connectionString, string jobName) 
     { 
      SqlConnection dbConnection = new SqlConnection(connectionString); 
      SqlCommand command = new SqlCommand(); 
      command.CommandType = System.Data.CommandType.StoredProcedure; 
      command.CommandText = "msdb.dbo.sp_help_jobactivity"; 
      command.Parameters.AddWithValue("@job_name", jobName); 
      command.Connection = dbConnection; 
      using (dbConnection) 
      { 
       dbConnection.Open(); 
       using (command) 
       { 
        SqlDataReader reader = command.ExecuteReader(); 
        reader.Read(); 
        Object[] values = new Object[reader.FieldCount]; 
        int fieldCount = reader.GetValues(values); 

        int jobStatus = -1; // inactive 
        for (int i = 0; i < fieldCount; i++) 
        { 
         object item = values[i]; 
         string colName = reader.GetName(i); 
         if (colName == "run_status") 
         { 
          if (values[i] != null) 
          { 
           jobStatus = (int)values[i]; 
           break; 
          } 
         } 
        } 
        reader.Close(); 
        return jobStatus; 
       } 
      } 
     } 
+0

[請不要把問題標題標籤(https://stackoverflow.com/help/tagging) – Liam

+0

您可以查詢['msdb.dbo。 sysjobactivity'](https://docs.microsoft.com/en-us/sql/relational-databases/system-tables/dbo-sysjobactivity-transact-sql)。它被記錄在案;存儲過程只是一個很好的東西。 –

+1

[我怎樣才能確定工作狀態?](https://stackoverflow.com/questions/200195/how-can-i-determine-the-status-of-a-job) – Liam

回答

0

這段代碼就是我所需要的。從MSDN

由於採取@JeroenMostert

SELECT sj.Name, 
    CASE 
     WHEN sja.start_execution_date IS NULL THEN 'Not running' 
     WHEN sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NULL THEN 'Running' 
     WHEN sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NOT NULL THEN 'Not running' 
    END AS 'RunStatus' 
FROM msdb.dbo.sysjobs sj 
JOIN msdb.dbo.sysjobactivity sja 
ON sj.job_id = sja.job_id 
WHERE session_id = (
    SELECT MAX(session_id) FROM msdb.dbo.sysjobactivity); 
0

可以在msdb數據庫檢查通過存儲過程sp_help_job

所以只需運行:

Use msdb 
go 
exec dbo.sp_help_job 

將返回所有的工作細節,你可以找到一個名爲current_execution_status一列。如果它是1意味着它正在運行。您可以從鏈接中獲得更多信息sp_help_job

您也可以爲存儲過程提供參數。

相關問題