zoukankan      html  css  js  c++  java
  • 【监控实践】【3.3】监控作业(使用数据库邮件)

    我们这里测试就用QQ邮箱直接把查询结果信息发送出来。

    前提参考:

    【1】Sql server用QQ邮箱发送邮件(相关图形界面文章:数据库邮件功能

    【2】sql server如何把查询结果发邮件出去

    【3】sql server 用脚本管理作业

    --查看从昨天0点到现在,运行有误的作业信息
    
    SELECT  j.name                        AS Job_Name        ,
            h.step_id                     AS Step_Id         ,
            h.step_name                   AS Step_Name       ,
            h.message                     AS Message         ,
            h.run_date                    AS Run_Date        ,
           -- h.run_time                    AS Run_Time        ,
            msdb.dbo.agent_datetime(h.run_date, h.run_time) 
                                        AS 'RunDateTime' ,
            CAST(run_duration / 10000 AS VARCHAR(2)) + N'小时'
            + CAST(( run_duration - run_duration / 10000 * 10000 ) / 100 AS VARCHAR(2)) + N'分钟'
            + SUBSTRING(CAST(run_duration AS VARCHAR(10)),
                                LEN(CAST(run_duration AS VARCHAR(10))) - 1, 2)  + N''
            AS run_duration
    FROM    msdb.dbo.sysjobhistory h
            LEFT JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
            where 1=1--h.step_id!=0
            AND run_date >= CAST(CONVERT(VARCHAR(8), GETDATE()-1, 112) AS INT)
            and h.run_status=0
    ORDER BY Job_Name, run_date,h.Step_Id

    邮件发送演示:(这里没有错误的,我就直接查看正确的了)

    use msdb
    go
    EXEC sp_send_dbmail
        @profile_name = 'dba_profile',
        @recipients = '815202984@qq.com',
        @subject = '今天的作业错误报表',
    @query='
    SELECT  j.name                        AS Job_Name        ,
            h.step_id                     AS Step_Id         ,
            h.step_name                   AS Step_Name       ,
            h.message                     AS Message         ,
            h.run_date                    AS Run_Date        ,
           -- h.run_time                    AS Run_Time        ,
            msdb.dbo.agent_datetime(h.run_date, h.run_time) 
                                        AS ''RunDateTime'',
            CAST(run_duration / 10000 AS VARCHAR(2)) + N''小时''
            + CAST(( run_duration - run_duration / 10000 * 10000 ) / 100 AS VARCHAR(2)) + N''分钟''
            + SUBSTRING(CAST(run_duration AS VARCHAR(10)),
                                LEN(CAST(run_duration AS VARCHAR(10))) - 1, 2)  + N''''
            AS run_duration
    FROM    msdb.dbo.sysjobhistory h
            LEFT JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
            where 1=1--h.step_id!=0
            AND run_date >= CAST(CONVERT(VARCHAR(8), GETDATE()-1, 112) AS INT)
            and h.run_status=1 --判断是否运行成功,1为成功 0为失败
    ORDER BY Job_Name, run_date,h.Step_Id
    '
    ----------------------
    查看结果,发现是乱的,所以我们还是最好使用HTML格式规范它

     使用html格式发送(这里没有错误的,我就直接用正确的演示了)

    use msdb
    go
    
    declare @table_HTML nvarchar(max)
    set @table_HTML=N'<H1> 作业失败报警</H1><table border=1>'
    +N'<tr><th>Job_Name</th><th>Step_Id</th><th>Step_Name</th><th>Message</th><th>Run_Date</th><th>RunDateTime</th>'+
    cast(
        (
                SELECT  j.name                        AS td        ,'',
                        h.step_id                     AS td         ,'',
                        h.step_name                   AS td       ,'',
                        h.message                     AS td         ,'',
                        h.run_date                    AS td        ,'',
                       -- h.run_time                    AS Run_Time        ,
                        msdb.dbo.agent_datetime(h.run_date, h.run_time) 
                                                    AS 'RunDateTime',
                        CAST(run_duration / 10000 AS VARCHAR(2)) + N'小时'
                        + CAST(( run_duration - run_duration / 10000 * 10000 ) / 100 AS VARCHAR(2)) + N'分钟'
                        + SUBSTRING(CAST(run_duration AS VARCHAR(10)),
                                            LEN(CAST(run_duration AS VARCHAR(10))) - 1, 2)  + N''
                        AS td,''
                FROM    msdb.dbo.sysjobhistory h
                        LEFT JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
                        where 1=1--h.step_id!=0
                        AND run_date >= CAST(CONVERT(VARCHAR(8), GETDATE()-1, 112) AS INT)
                        and h.run_status=1 --判断是否运行成功,1为成功 0为失败
                ORDER BY j.name, CAST(run_duration / 10000 AS VARCHAR(2)) + N'小时'
                        + CAST(( run_duration - run_duration / 10000 * 10000 ) / 100 AS VARCHAR(2)) + N'分钟'
                        + SUBSTRING(CAST(run_duration AS VARCHAR(10)),
                                            LEN(CAST(run_duration AS VARCHAR(10))) - 1, 2)  + N'',h.Step_Id
                for xml path ('tr')
        ) as nvarchar(max)    
    )+'</table>'
    
    
    
    EXEC sp_send_dbmail
        @profile_name = 'dba_profile',
        @recipients = '815202984@qq.com',
        @subject = '今天的作业错误报表',
        @body_format='html',
        @body= @table_HTML

     

    还可以使用其他方式把查询结果保存到文件,以附件的形式发送,这里不在演示,具体可以参考一下 :

    【2】sql server如何把查询结果发邮件出去

  • 相关阅读:
    TcxComboBoxProperties下拉框填充
    Delphi用QJSON解析JSON格式的数据 【转】
    Delphi的idhttp报IOHandler value is not valid错误的原因[转]
    RelayCommand
    ViewModelBase && ObservableObject
    MvvmLight ToolKit 教程
    WPF中的数据验证
    MvvmLight ToolKit .Net4.5版本 CanExecute不能刷新界面bug
    微软虚拟学院MVA 字幕获取方法
    WPF Binding INotifyPropertyChanged 多线程 深入理解
  • 原文地址:https://www.cnblogs.com/gered/p/11202766.html
Copyright © 2011-2022 走看看