dbo.sysjobhistory (Transact-SQL)

適用於:SQL ServerAzure SQL 受控執行個體

包含 SQL Server Agent 執行排程作業的相關信息。

注意

在大部分情況下,只有在作業步驟完成之後才會更新數據,而且數據表通常不包含目前進行中之作業步驟的記錄。 在某些情況下,基礎進程 提供進行中作業步驟的相關信息。

此數據表會儲存在 msdb 資料庫中。

資料行名稱 資料類型 描述
instance_id int 數據列的唯一標識碼。
job_id uniqueidentifier 作業識別碼。
step_id int 作業中步驟的標識碼。
step_name sysname 步驟的名稱。
sql_message_id int 如果作業失敗,則傳回任何 SQL Server 錯誤訊息的標識碼。
sql_severity int 任何 SQL Server 錯誤的嚴重性。
message nvarchar(4000) 如果有任何 SQL Server 錯誤,則為文字。
run_status int 工作執行的狀態:

0 = 失敗
1 = 成功
2 = 重試
3 = 已取消
4 = 進行中
run_date int 日期工作或步驟開始執行, yyyyMMdd 格式為 。 針對進行中歷程記錄,此值是寫入記錄的日期和時間。
run_time int 以格式啟動 HHmmss 作業或步驟的時間。
run_duration int 執行作業或步驟 HHmmss 的經過時間,格式為最長 24 小時的時間。 尋找程式代碼,以在範例轉譯較長的執行持續時間。
operator_id_emailed int 作業完成時通知操作員的標識碼。
operator_id_netsent int 作業完成時,由訊息通知的操作員標識符。
operator_id_paged int 作業完成時,呼叫器所通知的操作員標識碼。
retries_attempted int 作業或步驟的重試次數。
server sysname 執行作業的伺服器名稱。

範例

下列 Transact-SQL 查詢會將 run_daterun_time資料行轉換成名為 的 LastRunStartDateTimedatetime 資料行。 數據run_duration行會轉換成名為LastRunDurationSeconds的 int 資料行。 然後,這兩個資料行會用來計算 LastRunFinishDateTime。 數據 run_duration 行也會轉換成更方便使用的格式。 您可以在 SQL Server Management Studio 或 Azure Data Studio 中執行腳本。

SET NOCOUNT ON;

SELECT sj.name AS Name,
    sh.step_name AS StepName,
    shp.LastRunStartDateTime,
    DATEADD(SECOND, shp.LastRunDurationSeconds, shp.LastRunStartDateTime) AS LastRunFinishDateTime,
    shp.LastRunDurationSeconds,
    CASE
        WHEN sh.run_duration > 235959
            THEN CAST((CAST(LEFT(CAST(sh.run_duration AS VARCHAR),
                LEN(CAST(sh.run_duration AS VARCHAR)) - 4) AS INT) / 24) AS VARCHAR)
                    + '.' + RIGHT('00' + CAST(CAST(LEFT(CAST(sh.run_duration AS VARCHAR),
                LEN(CAST(sh.run_duration AS VARCHAR)) - 4) AS INT) % 24 AS VARCHAR), 2)
                    + ':' + STUFF(CAST(RIGHT(CAST(sh.run_duration AS VARCHAR), 4) AS VARCHAR(6)), 3, 0, ':')
        ELSE STUFF(STUFF(RIGHT(REPLICATE('0', 6) + CAST(sh.run_duration AS VARCHAR(6)), 6), 3, 0, ':'), 6, 0, ':')
        END AS [LastRunDuration (d.HH:MM:SS)],
    DATEADD(SECOND, shp.LastRunDurationSeconds, shp.LastRunStartDateTime) AS LastRunFinishDateTime
FROM msdb.dbo.sysjobs sj
INNER JOIN msdb.dbo.sysjobhistory sh ON sj.job_id = sh.job_id
CROSS APPLY (SELECT DATETIMEFROMPARTS(sh.run_date / 10000, -- years
        sh.run_date % 10000 / 100, -- months
        sh.run_date % 100, -- days
        sh.run_time / 10000, -- hours
        sh.run_time % 10000 / 100, -- minutes
        sh.run_time % 100, -- seconds
        0 -- milliseconds
    ) AS LastRunStartDateTime,
    (sh.run_duration / 10000) * 3600 -- convert hours to seconds, can be greater than 24
    + ((sh.run_duration % 10000) / 100) * 60 -- convert minutes to seconds
    + (sh.run_duration % 100) AS LastRunDurationSeconds
) AS shp;
GO