У меня есть оператор SQL, который работает так, как я хочу.
select COUNT(*), MIN(emailed_to)from email.email_archive
group by emailed_to
order by COUNT(*) desc
Результат выглядит следующим образом.
13 deadlockIE12388nnhy32@hepmeplease.com;
8 deadlockIE1277yhygt@hepmeplease.com;
4 deadlockFF17uyt9xx967@hepmeplease.com;
...
...
...
1 deadlockFF17uytsdfa7@hepmeplease.com;
Это достаточно просто, но тогда мне придется не забывать запускать выборку каждый день и делать конечно, все в порядке. Я хочу, чтобы хранимая процедура время от времени отправляла мне электронное письмо, и я мог решить, есть ли у меня проблема. Итак, я собрал следующее из многих ресурсов:
use MYDB;
go
IF SCHEMA_ID('monitors') IS NULL EXECUTE('CREATE SCHEMA monitors AUTHORIZATION dbo')
GO
if object_id('monitors.email_abuse') is null
exec('create procedure monitors.email_abuse as print ''stub'' return');
GO
alter procedure monitors.email_abuse
(@to varchar(max) = 'itops@hepmeplease.com',
@sendemail tinyint = 1)
as
set nocount on ;
set transaction isolation level read uncommitted ;
begin try
declare @errmsg varchar(max) = '',
@subject nvarchar(255);
select @subject = 'Run Away Email Monitor';
select @errmsg = REPLICATE(char(10),1)+
'# of Emails'+
REPLICATE(char(9),1)+
'Email Address'+
REPLICATE(CHAR(10),1);
select @errmsg = @errmsg +REPLICATE(char(9),1)+
CAST(COUNT(*) as CHAR(10))+
REPLICATE(char(9),1)+
CAST(MIN(emailed_to) as CHAR(45))
from
email.email_archive
group by
emailed_to
order by
COUNT(*) desc;
print @errmsg;
if @sendemail = 1
begin
exec master.dbo.sp_email
@to = @to,
@subject = @subject,
@body = @errmsg;
end
end try
begin catch
-- unexpected errors
exec sp_raise_error @rethrow = 1, @textdata = N'Error in monitors.email_abuse', @emailTo = N'itops@hepmeplease.com'
end catch
go
Но затем он отправляет мне по электронной почте следующий вывод, который представляет собой всего одну строку. Я знаю, что есть много строк, но по какой-то причине, когда я помещаю COUNT (*), MIN (emailed_to)
в оператор CAST
, это больше не работает. Я получаю электронное письмо с заголовком и одной строкой. Если я просто напечатаю вывод @errmsg, я получу именно то, что я получаю в электронном письме, заголовок и одну строку. как показано ниже.
# of Emails Email Address
1 y@y.com;
Я не уверен, что я делаю не так с моим оператором приведения.