Проблема с превращением простого выбора MsSQL в монитор

У меня есть оператор 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;

Я не уверен, что я делаю не так с моим оператором приведения.

1
задан Thomas Denton 13 October 2010 в 02:27
поделиться