【问题标题】:SQL Server Agent job history to HTML reportSQL Server 代理作业历史到 HTML 报告
【发布时间】:2020-09-07 18:07:35
【问题描述】:

我正在尝试将 SQL Server 代理作业历史记录输出到 HTML 报告中,并将其作为签到办公室发送到邮件。

这是我的代码:

$tabName = "Report"

$table = New-Object system.Data.DataTable "$tabName"

$col1 = New-Object system.Data.DataColumn "Server",([string])
$col2 = New-Object system.Data.DataColumn "Job Name",([string])
$col3 = New-Object system.Data.DataColumn "Step Name",([string])
$col4 = New-Object system.Data.DataColumn "Message",([string])
$col5 = New-Object system.Data.DataColumn "RunDate",([string])

$table.columns.add($col1)
$table.columns.add($col2)
$table.columns.add($col3)
$table.columns.add($col4)
$table.columns.add($col5)

$data = (Get-SqlAgentJobHistory -ServerInstance SQLServ1 -JobName "syspolicy_purge_history" -Since Yesterday | Select-Object Server, JobName, StepName, Message, RunDate ) 
$row = $table.NewRow()

$row."Server" = ($data."Server")
$row."Job Name" = ($data."JobName")
$row."Step Name" = ($data."StepName")
$row."Message" = ($data."Message")
$row."RunDate" = ($data."RunDate")

$table.Rows.Add($row)

$Head = @"
 
<style>
  body {
    font-family: "Arial";
    font-size: 8pt;
    color: #4C607B;
    }
  th, td {
    border: 1px solid #e57300;
    border-collapse: collapse;
    padding: 5px;
    }
  th {
    font-size: 1.2em;
    text-align: left;
    background-color: #003366;
    color: #ffffff;
    }
  td {
    color: #000000;
    }
  .even { background-color: #ffffff; }
  .odd { background-color: #bfbfbf; }
</style>
 
"@

$Report = [string]$body = [PSCustomObject]$table | select-Object Server, JobName, StepName, Message, RunDate  | ConvertTo-HTML -head $Head -Body "<font color=`"Black`"><h4>SQL Job History</h4></font>"  | Out-File "C:\Users\Administrator\Documents\scripts\sql job history\report.html"  

我添加的 HTML 字段在我输出报告时显示,但不显示内容。

请问有什么建议吗?

【问题讨论】:

    标签: html sql-server powershell email server


    【解决方案1】:

    您需要foreach 覆盖来自Get-SqlAgentJobHistory 的结果,例如

    foreach ( $r in $data )
    {
        $row = $table.NewRow()
    
        $row."Server" = ($r."Server")
        $row."Job Name" = ($r."JobName")
        $row."Step Name" = ($r."StepName")
        $row."Message" = ($r."Message")
        $row."RunDate" = ($r."RunDate")
    
        $table.Rows.Add($row)
    }
    

    【讨论】:

      【解决方案2】:

      试试下面的代码。它会发送一封电子邮件,其中包含过去 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, '&lt;', '<' ), '&gt;', '>' )
                    + '</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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多