Задача: периодически направлять на определенную почту отчет о состоянии объектов в системе.
Для этого реализуем функциональность по следующей схеме:
1. Хранимая процедура подготовки данных и формирования результата в виде разметки
2. Вызов внешнего действия с отправкой почты.
Примеры:
Готовим данные в хранимой процедуре 1:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[as_perf_diag]
@level int =1,
@s nvarchar(max) OUTPUT
AS
BEGIN
declare @t1 table (title nvarchar(max), db nvarchar(256), [desc] nvarchar(max),
digit nvarchar(512), important int)
declare @s1 nvarchar(max)=''
-- пример сбора данных
insert into @t1(title, db, [desc], digit, important)
SELECT TOP 3
'Запрос с большим CPU' title,
db_name(st.dbID) db,
substring(st.text, 1, 60)+ '...' [desc],
cast(qs.total_worker_time/qs.execution_count as nvarchar) AS digit,
3
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
where qs.total_worker_time >100
order by qs.total_worker_time/qs.execution_count desc
-- ... здесь добавление других результатов в таблицу @t1
-- формируем разметку результата
select @s= STUFF((
select ' <h3>' + db + ' - ' + title + iif(isnull(digit, '')<>'', ' ('+digit +')', '' ) + '</h3>' +
'<p>' + [desc] + '</p>' from (
select * from @t1
) t1
order by db, title desc
FOR XML PATH, TYPE).value('.[1]','nvarchar(max)' ), 1, 1, '')
END;
1 раз в день вызываем эту процедуру и отправляем почту через внешнее действие:
CREATE PROCEDURE [dbo].[falcon_nt_sync_day]
AS
BEGIN
declare @s nvarchar(max) = ''
exec [as_perf_diag] @level = 1, @s=@s OUTPUT
if(len(@s)>0) begin
select 'email' type, 'ru@rudensoft.ru' [to], 'Профилактика базы falconspace.ru' subject, @s body
end
END