试试下面的代码。它会发送一封电子邮件,其中包含过去 24 小时的工作信息。
只需将'email_recipients_list' 和'url_to_ssis_jobs_monitoring_report' 替换为相关值即可。
DECLARE
@email_recipients VARCHAR(128)
, @email_subject NVARCHAR(128)
, @email_body_format VARCHAR(128)
, @email_body NVARCHAR(MAX)
, @job_count INT
, @table_style VARCHAR(512)
, @from datetime
, @periode NVARCHAR(512)
, @url_to_ssis_jobs_monitoring_report VARCHAR(128)
SET @email_recipients='email_recipients_list'
SET @email_body_format='HTML'
SET @table_style = 'cellpadding="2" cellspacing="2" border="1" style="border-collapse: collapse; border: 1px solid black;"';
SET @from = DATEADD(day, -1, getdate())
SET @periode = 'between ' + FORMAT(DATEADD(d, -1, GETDATE()), 'yyyy-MM-dd HH:MM:ss') + ' and ' + FORMAT(GETDATE(), 'yyyy-MM-dd HH:MM:ss')
SET @email_subject = 'SSIS Jobs ' + @periode
SET @url_to_ssis_jobs_monitoring_report = 'url_to_ssis_jobs_monitoring_report'
DECLARE @job_table NVARCHAR(MAX)
DECLARE @job TABLE(
[Start time] NVARCHAR(19)
, [Job] NVARCHAR(128)
, [Job execution status] NVARCHAR(128)
, [Execution time] NVARCHAR(8)
);
WITH subset As (
SELECT
CAST(left(t1.run_date,8) As DATETIME) + CAST(STUFF(STUFF(RIGHT('000000'+ISNULL(CAST(t1.run_time As NVARCHAR(6)),''),6),5,0,':'),3,0,':') As datetime) As [Start time]
, t1.job_id As 'Id Job'
, t1.name As Job
, CASE IIF(MIN(t2.run_status) = 1, MAX(t2.run_status), MIN(t2.run_status))
WHEN 0 THEN 'Failed'
WHEN 1 THEN 'Succeeded'
WHEN 2 THEN 'Retry'
WHEN 3 THEN 'Canceled'
WHEN 4 THEN 'In Progress'
ELSE 'Unknown'
END As [Status]
, CONVERT(TIME(0), DATEADD(SECOND,
SUM(
DATEDIFF(SECOND,0,CAST(CAST(STUFF(STUFF(RIGHT('000000'+ISNULL(CAST(t2.run_duration As NVARCHAR(6)),''),6),5,0,':'),3,0,':') As TIME) As DATETIME))
)
, 0)
) As 'Execution time'
FROM (
SELECT
sjh.job_id
,sj.name As name
,sjh.run_date
,sjh.run_time
,LEAD(sjh.run_time,1) OVER ( ORDER BY run_date, run_time) As next_run_time
,MIN(sjh.run_status) As run_status
FROM [msdb].[dbo].[sysjobhistory] sjh
LEFT JOIN [msdb].[dbo].[sysjobs] sj
ON sjh.job_id = sj.job_id
WHERE
sjh.step_id = 1
-- To exclude unrelevant jobs
AND TRY_CONVERT(UNIQUEIDENTIFIER,sj.name) IS NULL
GROUP BY sjh.job_id, sj.name, sjh.run_date, sjh.run_time
) t1
LEFT JOIN [msdb].[dbo].[sysjobhistory] t2
ON
t2.job_id = t1.job_id
AND t2.run_date = t1.run_date
WHERE
t2.job_id = t1.job_id
AND t2.run_date = t1.run_date
AND t2.step_id <> 0
AND CAST(left(t1.run_date,8) As datetime) + CAST(STUFF(STUFF(RIGHT('000000'+ISNULL(CAST(t1.run_time As NVARCHAR(6)),''),6),5,0,':'),3,0,':') As datetime) > @from
-- To exclude unrelevant jobs
AND TRY_CONVERT(UNIQUEIDENTIFIER,t1.name) IS NULL
GROUP BY t1.job_id, t1.run_date, t1.run_time, t1.name, t1.next_run_time
)
INSERT INTO @job
SELECT
FORMAT(s.[Start time], 'yyyy-MM-dd HH:MM:ss') As [Start time]
, s.Job
, s.Status
, CAST(s.[Execution time] As NVARCHAR(8)) As [Execution time]
FROM subset s
SET @job_count = @@ROWCOUNT
If @job_count > 0
BEGIN
SET @job_table = CAST( (
SELECT td = [Start time] + '</td><td>' + [Job] + '</td><td>' + [Job execution status] + '</td><td>' + [Execution time]
FROM (
SELECT *
FROM @job
) As d
ORDER BY [Start time]
FOR XML PATH( 'tr' ), TYPE ) As NVARCHAR(MAX) )
set @job_table = '<table ' + @table_style + '>'
+ '<tr><th>Start time</th><th>Job</th><th>Job execution status</th><th>Execution time</th></tr>'
+ replace( replace( @job_table, '<', '<' ), '>', '>' )
+ '</table>'
SET @email_body = @job_table
END
SET @email_body = '<h1>SSIS Jobs ' + @periode + '</h1>' + @email_body
SET @email_body = @email_body + '<br><br><a href="url_to_ssis_jobs_monitoring_report">SSIS jobs monitoring report</a>'
-- Send email
EXEC msdb.dbo.sp_send_dbmail
@recipients=@email_recipients
, @body=@email_body
, @subject=@email_subject
, @body_format=@email_body_format