Изменить цвет значения в Почте БД SQL Server - PullRequest
0 голосов
/ 19 декабря 2018

Я создал оповещение Почты БД, которое отправляет таблицу в формате HTML, в которой отображается состояние прохождения или сбоя моих агентов SQL.

Предупреждение работает хорошо, но пользователь запросил дополнительное изменение там, где он хочетусловное форматирование при статусе Pass / Fail данных, при котором статус ошибки должен быть выделен КРАСНЫМ, а статус передачи должен быть выделен ЗЕЛЕНЫМ.

Возможно ли достичь этого в SQL с использованием форматирования DB Mail и HTML?Несколько форумов заявили, что, возможно, потребуется использовать JavaScript, но я не уверен, возможно ли даже использовать JS в SQL.

Мой код приведен ниже:

---------------------------------------------------------------------------- 
----------------------------------- Declare Variables ---------------------- 
---------------------------------------------------------------------------- 
Declare @email_body nvarchar(max)
Declare @email_profile_name nvarchar(max)
Declare @email_recipients nvarchar(max)
Declare @email_subject nvarchar(max)
Declare @tableHTML nvarchar(MAX) = ''
Declare @Style nvarchar(MAX) = ''
Declare @Textdate nvarchar(max)
DECLARE @crlf nvarchar = CHAR(13)+CHAR(10)
Declare @Server nvarchar(max)


----------------------------------------------------------------------------            
--------------------------- Set Varriables (That should not change) --------        
----------------------------------------------------------------------------    
set @Server = @@SERVERNAME
set @Textdate = cast(getdate() as date)
Set @email_subject = @Textdate + ': Morning SQL Server Checks'

----------------------------------------------------------------------------    
----------------------------------- Set Varriables (User Input) ------------ 
---------------------------------------------------------------------------- 
--Add other Email addresses as needed. Seperate with Semi-colon (;)
set @email_recipients = 'Email@Email.com'


---------------------------------------------------------------------------- 
----------------------------------- Create Temp Tables --------------------- 
---------------------------------------------------------------------------- 
IF OBJECT_ID('tempdb..#Results') IS NOT NULL 
DROP TABLE #Results
Create table #Results (
    [Server] nvarchar(max),
    [Entity] nvarchar(max),
    [Status] nvarchar(max),
    [Message] nvarchar(max),
    [Type] nvarchar(max))


----------------------------------------------------------------------------    
----------------------------------- Generate Data -------------------------- 
---------------------------------------------------------------------------- 
--Gets SQL Agent Results (Script Derived from here: 
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/534cc5be-0021-4766-    
9eef-92fea819e2e3/script-to-get-sql-server-agent-job-schedule-and-the-last- 
run-status?forum=sqldatabaseengine)
Insert into #Results
SELECT @@SERVERNAME as 'Server Name'
      ,J.Name AS 'Job Name' 
      --,CASE J.Enabled  WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' END as 'Job     
 Enabled'
      ,CASE WHEN LASTRUN.run_status = 0 THEN 'Failed'
            WHEN LASTRUN.run_status = 1 THEN 'Succeeded'
            WHEN LASTRUN.run_status = 2 THEN 'Retry'
            WHEN LASTRUN.run_status = 3 THEN 'Cancelled'
            ELSE 'Unknown' END as 'Last Run Status'                           
      ,LASTRUN.message as 'Last Run Message'
      ,'SQL Agent Jobs' as 'Type'
FROM msdb.dbo.sysjobs J LEFT OUTER JOIN msdb.dbo.sysjobschedules JS ON     
J.job_id = JS.job_id
               LEFT OUTER JOIN msdb.dbo.sysschedules S ON JS.schedule_id = S.schedule_id
               LEFT OUTER JOIN (SELECT J1.job_id
                                      ,J1.RUN_DURATION
                                      ,J1.run_date
                                      ,J1.run_time
                                      ,J1.message
                                      ,J1.run_status
                                 FROM msdb.dbo.sysjobhistory J1
                                 WHERE instance_id = (SELECT MAX(instance_id) 
                                                      FROM msdb.dbo.sysjobhistory J2 
                                                      WHERE J2.job_id = J1.job_id)) LASTRUN ON J.job_id = LASTRUN.job_id
where J.Enabled = 1 --Only check for agents that have been enabled 
-------------------------------------------------------------------------- 
----------------------------------- Generate Email ------------------------- 
---------------------------------------------------------------------------- 
--Set Style (CSS)
SET @Style += +N'<style type="text/css">' + N'.tg  {border-    
 collapse:collapse;border-spacing:0;border-color:#aaa;}'
+ N'.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#aaa;color:#333;background-color:#fff;}'
+ N'.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#aaa;color:#fff;background-color:#f38630;}'
+ N'.tg .tg-9ajh{font-weight:bold;background-color:#68cbd0}' + N'.tg .tg-hgcj{font-weight:bold;text-align:center}'
+ N'</style>';

 --Set Email Output (HTML Layout)
 Set @tableHTML += @Style + @tableHTML + N'<H1 style="color:Blue;">' + 
 @Textdate + ': Morning SQL Server Checks</H1>' +
                                    N'<H2>' + @Server + '</H2>' +
                                    N'<H3>Databases</H3>' +
+ N'<table class="tg">' --DEFINE TABLE

-- Define Headers for Database Check
+ N'<tr>'
+ N'<H3>SQL Agents</H3>' +
+ N'<table class="tg">' --DEFINE TABLE

+ N'<tr>'
+ N'<td class="tg-9ajh">Server</td>'
+ N'<td class="tg-9ajh">Entity</td>' 
+ N'<td class="tg-9ajh">Status</td>'
+ N'<td class="tg-9ajh">Message</td>'
+ N'<td class="tg-9ajh">Type</td></tr>'

-- Define data for SQL Agent and cast to xml
+ Cast((
        Select td = isnull([Server],'###')
              ,''
              ,td = isnull([Entity],'###')
              ,''
              ,td = isnull([Status],'###')
              ,''
              ,td = isnull([Message],'###')
              ,''
              ,td = isnull([Type],'###')
              ,''
        from #Results
        where [type] = 'SQL Agent Jobs' FOR
         XML PATH('tr') ,
             TYPE
       ) AS NVARCHAR(MAX)) 
       + N'</table>'; 

-- Send the Email 
EXEC msdb.dbo.sp_send_dbmail
     @profile_name = 'Outlook Support Profile', 
     @recipients = @email_recipients,
     @body = @tableHTML,
     @body_format = 'HTML',
     @subject = @email_subject 

----------------------------------------------------------------------------
----------------------------------- Cleanup --------------------------------
----------------------------------------------------------------------------
drop table #Results

Я надеюськод достаточно ясен и имеет смысл.

Спасибо, Энтони

1 Ответ

0 голосов
/ 19 декабря 2018

Я делаю нечто подобное с моими электронными письмами аудита dbmail, чтобы различать производственные и непроизводственные экземпляры.

Метод, который я использую, состоит в том, чтобы предварительно определить информацию о стиле и затем использовать уникальное значение в строке тела для идентификациигде стиль должен быть применен.В вашем случае мы можем использовать уникальные значения <td>Failed и <td>Succeeded.Произведя замену этих значений в версии, включающей стиль, вы должны получить таблицу с вашим условным форматированием.

Я внес следующие два изменения в ваш скрипт и запустил его для одного из моих тестовых экземпляров.Похоже, это должно привести вас туда, куда вы хотите.

Сначала обновите раздел стилей:

--Set Style (CSS)
SET @Style += +N'<style type="text/css">' + N'.tg  {border-    
 collapse:collapse;border-spacing:0;border-color:#aaa;}'
+ N'.tg .green{background-color: green; color:white;}'
+ N'.tg .red{background-color: red; color:white;}'
+ N'.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#aaa;color:#333;background-color:#fff;}'
+ N'.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#aaa;color:#fff;background-color:#f38630;}'
+ N'.tg .tg-9ajh{font-weight:bold;background-color:#68cbd0}' + N'.tg .tg-hgcj{font-weight:bold;text-align:center}'
+ N'</style>';

После сборки @tableHTML добавьте REPLACE для вставки форматирования стиля в сгенерированныйстол:

SELECT @tableHTML = REPLACE(REPLACE(@tableHTML,N'<td>Failed',N'<td class="Red">Failed'),N'<td>Succeeded',N'<td class="green">Succeeded')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...