Как стать автором
Обновить

Комментарии 20

сформировать HTML-отчет для дальнейшей отправки на почту администраторам о результатах:

Формирование текста HTML отчета в цикле это сильно! А почему не использовали конкатенацию через for xml path('')?
Это одна из возможностей
Можно конечно, как и Вы предлагаете.
Приведите пример
Примерно накидал код на основе вашей процедуры. Как бонус обернул текст в табличку.

Пример конкатенации
declare @body nvarchar(max) 

set @body = (	select     
			    cast(Job_GUID as nvarchar(36)) + '</td><td>' 
			    + isnull(Job_Name, '') + '</td>' 
		        from    srv.ShortInfoRunJobs
			for xml path('tr'))

set @body = '<html>
				<head>
					<style type="text/css">
						table {
							border-collapse: collapse;
							border: 2px solid black;
							font: 10pt helvetica;
						}
						th {
							padding: 10px;
							text-align: center;
						}
						td {
							padding: 10px;
							text-align: center;
						}
					</style>
				</head>
				<body>
					<table border="1" cellspacing="0">'
				  + '<tr><th>ID</th><th>Job name</th></tr>'
				  + replace( replace( @body, '<', '<' ), '>', '>' )
				  + '</table>
				</body>
			 </html>';

Ваше решение намного улучшило мое предложенное)
Спасибо)
Из опыта, используем Zabbix для централизованного мониторинга. Количество заданий, выполнившихся с ошибкой мониторим через счетчик \SQLAgent:Jobs(_Total)\Failed jobs.
Про Zabbix спасибо-попробуем использовать)
На счет заданий-здесь важно еще и сколько по времени выполняется задание
Zabbix-ом можно мониторить и время выполнения задания, например написав соответсвтующий запрос и выполнять его через zabbix по odbc. Через zabbix можно вообще много чего реализовать, было бы желание))
Vitoska, порекомендуйте ссылки на то, что может Заббикс, как его устанавливать и настраивать.
Здесь ознакомился
https://www.zabbix.com/documentation/3.0/ru/manual — официальная документация, более чем достаточно для начала. Развернуть можно несколькими способами, если не хотите заморачиваться, то можно скачать уже готовый образ системы и развернуть его, вот ссылка http://www.zabbix.com/ru/download. Относительно SQL Server мы мониторим счетчики perfmon и по odbc.
Спасибо)
Пожалуйста, будут вопросы пишите.
Можно без создания прямо в агенте сделать задание
IF (SELECT COUNT(*)
FROM sysjobs AS s 
INNER JOIN sysjobsteps AS s2 (nolock) ON s2.job_id = s.job_id
INNER JOIN dbo.sysjobhistory sh (nolock) ON sh.instance_id=(SELECT MAX(sjh.instance_id) FROM dbo.sysjobhistory sjh (nolock) WHERE sjh.job_id=s.job_id AND sjh.step_id=s2.step_id) 
			  AND sh.run_date>=(SELECT MAX(sjh.run_date) FROM dbo.sysjobhistory sjh (nolock) WHERE sjh.job_id=s.job_id AND sjh.step_id=0)
WHERE s.[enabled]=1 AND sh.run_status=0)>0
BEGIN
DECLARE @tableHTML AS NVARCHAR(max)

SET @tableHTML =
    N'<H1>Ошибки в джобах на sql сервере '+@@SERVERNAME+'</H1>' +
    N'<table border="1">' +
    N'<tr><th>Джоб</th><th>ID шага</th>' +
    N'<th>Имя шага</th><th>команда</th><th>база</th>' +
    N'<th>последний запуск</th><th>ошибка</th></tr>' +
    CAST ( ( SELECT td = s.name,'', td = s2.step_id,'', td = s2.step_name, '',td = cast(s2.command AS VARCHAR(100)),'', td = s2.database_name,'',
       td = s2.last_run_date,'', td = cast(sh.[message] AS VARCHAR(100))
FROM sysjobs AS s (nolock)
INNER JOIN sysjobsteps AS s2 (nolock) ON s2.job_id = s.job_id
INNER JOIN dbo.sysjobhistory sh (nolock) ON sh.instance_id=(SELECT MAX(sjh.instance_id) FROM dbo.sysjobhistory sjh (nolock) WHERE sjh.job_id=s.job_id AND sjh.step_id=s2.step_id) 
			  AND sh.run_date>=(SELECT MAX(sjh.run_date) FROM dbo.sysjobhistory sjh (nolock) WHERE sjh.job_id=s.job_id AND sjh.step_id=0)
WHERE s.[enabled]=1 AND sh.run_status=0
--ORDER BY s.name, s2.step_id
FOR XML PATH('tr'), TYPE 
    ) AS NVARCHAR(MAX) ) +
    N'</table>' ;


DECLARE @subject AS NVARCHAR(max)
SET @subject='Ошибка в работе джобов на сервере '+@@SERVERNAME

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'MAIL'
,@recipients = ''
,@subject = @subject
,@importance ='Normal'
,@body =  @tableHTML
,@body_format = 'HTML' 

END

подставив нужных получателей и почтовый профиль
Верно, однако лучше оборачивать все в хранимые процедуры. Так проще поддерживать и найти зависимости, чем код читать прямо в заданиях Агента
Там убогий EditBox под это дело и весь этот код совершенно невозможно будет прочитать, тем более исправить.
У нас правда некоторые до сих пор побыстрому пишут код прямо в заданиях
Приходится потом оборачивать, иначе глаз сломаешь, особенно когда код не на один экран или запрос очень нетривиальный
У нас так никто не делает. Все пишут что надо в обычном окне запросов, и CtrlC-CtrlV в это окошко. А потом начинается: Ты взял бэкапы? — Да, вот они — А джобы где???
Знакомая ситуация)
Огромное спасибо programmer76 за увиденную ошибку в публикации. Поправил.
Ошибка заключалась в том, что при вставке данных нет смысла сортировать, а сортировать нужно в момент отбора-шаг 4 алгоритма.
Приношу извинения, fakir89 спасибо) Просто с телефона неудобно писать и мелко все
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.