Добавление динамического содержимого в тело письма (базы данных) с помощью sp_send_dbmail

Есть ли способ добавить время в следующем запросе в качестве тела моего письма:

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'TEST_DEV',
    @recipients = 'xxx@gmail.com',
    @query = ' select 
            Percentage = CONVERT(DECIMAL(10,1),100 - (CAST(COUNT(DISTINCT case when PD.Exception  != ' ' then PD.Id  END) as float)/CAST(COUNT(PD.Id) as float)*100))
         from 
                DataBaseName.dbo.Product P INNER JOIN DataBaseName.dbo.LogProduct PD 
                ON P.LogId = PD.LogId

                WHERE   
                ResponseTime < GETDATE() and  RequestTime > DATEADD(MINUTE, -150, GETDATE())
                ' ,
    @subject = 'Test',
@body = 'Please check the attached file for Providers with Many unsuccessful calls between the time xx an yy',
    @attach_query_result_as_file = 1 ;

В текущей строке

@body = 'Please check the attached file for info on calls between the time xx an yy',

Я хотел бы добавить GetDate() вместо xx и DATEADD(MINUTE, -150, GETDATE()) вместо yy?

Является ли это возможным?

declare @body nvarchar(max) 
EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'DEV',
    @recipients = 'xxx@gmail.com',
    @query = 'exec Database.dbo.spTest' ,
    @subject = 'Test',
 select @body = 'Please check the attached file for info on calls between the time ........................',
    @attach_query_result_as_file = 1 ;

Вы хотите, чтобы я сделал что-то подобное?

2 ответа

Вы можете создать хранимую процедуру для отправки этого электронного письма [s] следующим образом:

CREATE PROCEDURE MySchema.MyProcedure
(
    @arg1 type1, ...
)
AS
BEGIN

DECLARE @style TINYINT;
SET @style = 108 -- hh:mm:ss ; For other style please visit http://technet.microsoft.com/en-us/library/ms187928.aspx
DECLARE @body_content NVARCHAR(MAX);
SET @body_content = 'Please check the attached file for Providers with Many unsuccessful calls between the time ' + CONVERT(VARCHAR(25),GETDATE(),@style) + ' and ' + CONVERT(VARCHAR(25),DATEADD(MINUTE, -150, GETDATE()),@style) ;

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'TEST_DEV',
    @recipients = 'xxx@gmail.com',
    @query = ' select 
            Percentage = CONVERT(DECIMAL(10,1),100 - (CAST(COUNT(DISTINCT case when PD.Exception  != '' '' then PD.Id  END) as float)/CAST(COUNT(PD.Id) as float)*100))
         from 
                DataBaseName.dbo.Product P INNER JOIN DataBaseName.dbo.LogProduct PD 
                ON P.LogId = PD.LogId

                WHERE   
                ResponseTime < GETDATE() and  RequestTime > DATEADD(MINUTE, -150, GETDATE())
                ' ,
    @subject = 'Test',
    @body = @body_content,
    @attach_query_result_as_file = 1 ;

END;

Вы можете объявить свою переменную @body перед оператором EXEC и сделать ее любой строкой, которую захотите.

Редактировать:

Я обновил это, чтобы быть более многословным. Я не настроил sp_send_dbmail где-либо для тестирования, но я думаю, что он должен работать нормально. Я создал строковую переменную с именем @bodyMsg, установил ее на нужную строку перед вызовом хранимой процедуры, а затем передал значение переменной @body в sp_send_dbmail.

declare @bodyMsg nvarchar(max) 

select @bodyMsg = 'Please check the attached file for info on calls between the time ' + convert(varchar,GETDATE()) + ' and ' + convert(varchar,DATEADD(mm, -150, getdate())) + '.'

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'TEST_DEV',
    @recipients = 'xxx@gmail.com',
    @query = ' select 
            Percentage = CONVERT(DECIMAL(10,1),100 - (CAST(COUNT(DISTINCT case when PD.Exception  != ' ' then PD.Id  END) as float)/CAST(COUNT(PD.Id) as float)*100))
         from 
                DataBaseName.dbo.Product P INNER JOIN DataBaseName.dbo.LogProduct PD 
                ON P.LogId = PD.LogId

                WHERE   
                ResponseTime < GETDATE() and  RequestTime > DATEADD(MINUTE, -150, GETDATE())
                ' ,
    @subject = 'Test',
    @body = @bodyMsg,
    @attach_query_result_as_file = 1 ;

Затем просто передайте переменную @body в хранимую процедуру sp_send_dbmail. Различные форматы даты и времени можно найти здесь: http://technet.microsoft.com/en-us/library/ms187928.aspx

Другие вопросы по тегам