2010-01-21 49 views
8

Tôi có một bước công việc thực hiện thủ tục được lưu trữ. Tôi muốn có được ngày của thời gian thực hiện công việc thành công cuối cùng để tôi có thể cập nhật một vùng đồng bằng thay vì toàn bộ tập dữ liệu. Ngay bây giờ tôi có thiết lập công việc để chạy một lần mỗi ngày, vì vậy tôi có một tham số mặc định nếu nó là null tôi đặt nó thành GETDATE() - 1 vì vậy tôi vẫn đang cập nhật một delta nhưng những gì tôi muốn cần làm là đặt ngày cho lần thực hiện thành công cuối cùng của công việc.Nhận ngày chạy công việc thành công cuối cùng?

exec dbo.usp_UpdateFrom @LastSuccessfulExecutionTime 

thủ tục hiện hành là một cái gì đó giống như

CREATE PROCEDURE dbo.usp_UpdateFrom 
    @FromDate datetime = NULL --would like to pass last successful execution time of the job 
AS 
    IF @FromDate IS NULL 
     SET @FromDate = GETDATE() - 1 

    -- do stuff 
END 

Trả lời

0

Sử dụng thông tin từ các chủ đề sau:

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=112427 http://www.sqlservercentral.com/Forums/Topic542581-145-1.aspx

Đây là những gì tôi đã đưa ra ...

DECLARE 
    @statement nvarchar(72), 
    @job_id uniqueidentifier, 
    @last_run_date datetime 

SET @statement = 'SET @guid = CAST(' + SUBSTRING(APP_NAME(), 30, 34) + ' as uniqueidentifier)' 

EXECUTE sp_executesql @statement, N'@guid uniqueidentifier OUT', @guid = @job_id OUT 

SELECT TOP (1) 
    @last_run_date = CAST(STR(run_date, 8, 0) as datetime) + CAST(STUFF(STUFF(STR(run_time, 6, 0), 3, 0, ':'), 6, 0, ':') as datetime) 
FROM msdb.dbo.sysjobhistory 
WHERE job_id = @job_id 
AND run_status = 1 
ORDER BY 
    CAST(STR(run_date, 8, 0) as datetime) + CAST(STUFF(STUFF(STR(run_time, 6, 0), 3, 0, ':'), 6, 0, ':') as datetime) DESC 

EXEC dbo.usp_UpdateFrom @last_run_date 

tôi không đặc biệt cảm thấy thoải mái với điều này, nhưng tôi thích phương thức nhận job_id hơn tùy thuộc vào tên công việc.

2

Có một cái nhìn tại this bài viết, nó có thể chỉ cho bạn đi đúng hướng. Thật không may tôi không có SQL Server trên máy nhà của tôi vì vậy không thể kiểm tra nó ra cho bạn!

Về cơ bản, bạn cần truy vấn bảng sysjobactivity và nhận các giá trị từ start_execution_date và stop_execution_date. Bạn sẽ cần job_id, nhưng tôi không chắc bạn sẽ lấy nó từ đâu.

Tôi hy vọng điều này sẽ hữu ích.

EDIT Ok, tôi đã thực hiện một số nghiên cứu nhiều hơn và thấy đoạn mã sau đoạn mã

DECLARE @jobId binary(16) 

SELECT @jobId = job_id FROM msdb.dbo.sysjobs WHERE (name = N'Name of Your Job') 
14

Các bảng bạn muốn là sysjobssysjobhistory trong msdb. Mặc dù được cảnh báo! SQL Server chỉ duy trì một số lượng bản ghi nhất định, vì vậy nếu có quá nhiều công việc và lịch sử không đủ lớn, bạn sẽ không có lịch sử.

Mã sau truy xuất job_id cho tên công việc đã cho và truy vấn bảng lịch sử cho lần chạy thành công cuối cùng (tức là bước 0, trạng thái 1). Như bạn thấy, bạn phải chuyển đổi thời gian chạy trở lại một ngày, như SQL Server lưu trữ nó trong hai cột int:

DECLARE @job_id binary(16) 
SELECT @job_id = job_id FROM msdb.dbo.sysjobs WHERE (name = N'YourJobName') 

SELECT TOP 1 
    CONVERT(DATETIME, RTRIM(run_date)) 
    + ((run_time/10000 * 3600) 
    + ((run_time % 10000)/100 * 60) 
    + (run_time % 10000) % 100)/(86399.9964) AS run_datetime 
    , * 
FROM 
    msdb..sysjobhistory sjh 
WHERE 
    sjh.step_id = 0 
    AND sjh.run_status = 1 
    AND sjh.job_id = @job_id 
ORDER BY 
    run_datetime DESC 
+0

Cảm ơn thông tin trên sysjobhistory, tôi sợ phải phụ thuộc vào tên công việc mặc dù. – Dave

+0

nghĩ rằng điều này có thể dễ dàng hơn cho bạn. Nó thậm chí còn đơn giản hơn mà không có tên công việc! –

+0

vâng, nhưng tôi vẫn cần phải có job_id – Dave

2

sysjobhistory chỉ duy trì một số lượng hồ sơ nhất định, tôi khuyên bạn nên sử dụng sysjobactivity, giữ cho "lịch sử" thực thi cuối cùng của từng công việc và phiên.

SELECT TOP 1 start_execution_date 
FROM msdb.dbo.sysjobactivity 
WHERE run_requested_date IS NOT NULL 
AND job_id = @job_id 
ORDER BY session_id DESC; 

LƯU Ý: Nếu một công việc chưa được thực hiện trong suốt cuộc đời của một phiên làm việc, hầu hết các giá trị này sẽ được null.

CŨNG có một hệ thống Stored Proceduresp_help_job trả về thông tin này. Nó chấp nhận job_id, enabled, v.v ... làm thông số trả về 1 hoặc nhiều bản ghi.

0

Để có được công ăn việc làm cuối chạy thành công:

SELECT 
    h.[job_id] 
    ,j.Name JobName 
    ,CONVERT(CHAR(10), CAST(STR(run_date,8, 0) AS dateTIME), 111) [LastRunDate] 
    ,STUFF(STUFF(RIGHT('000000' + 
    CAST (run_time AS`` VARCHAR(6)) ,6),5,0,':'),3,0,':') [LastRunTime] 
    ,CASE run_status 
    WHEN 0 THEN 'Failed' 
    WHEN 1 THEN 'Succeeded' 
    WHEN 2 THEN 'Retry' 
    WHEN 3 THEN 'Cancelled' 
    WHEN 4 THEN 'In Progress' 
    END AS ExecutionStatus             
    FROM [msdb].[dbo].[sysjobhistory] h 
    JOIN msdb.dbo.sysjobs j ON h.job_id=j.job_id 
    WHERE run_status=1 
    ORDER BY run_date DESC,run_time DESC 
Các vấn đề liên quan