1

Я хранил процедуру usp_emailRecipients, которая возвращает список адресов электронной почты с разделителями с запятой. Это список адресов электронной почты, которые будут отправляться по электронной почте с помощью msdb.dbo.sp_send_dbmail.Установить аргументы dbo.sp_send_dbmail для возвращаемого значения хранимой процедуры?

Как установить значение @recipients в список, возвращенный в моей хранимой процедуре?

Я не могу изменить хранимую процедуру на данный момент.

Что-то вроде:

EXEC msdb.dbo.sp_send_dbmail 
@profile_name = 'Bob Jones', 
@recipients = 'exec usp_emailRecipients', 
@subject = 'Test email', 
@execute_query_database = 'Sales', 
@query = N'select * from sales', 
@attach_query_result_as_file = 1, 
@query_attachment_filename = 'Sales.txt' 

Спасибо.

ответ

1

Как вы это кодировали, он отправит строковый литерал в качестве значения для получателей. Это не так, как это работает. Способ сделать это - использовать переменную OUTPUT в usp_emailRecipients. Это потребует изменения в вашей процедуре, поэтому вы используете параметр OUTPUT. Затем вы заполняете переменную следующим образом.

declare @recipientList varchar(max) 
exec usp_emailRecipients @recipientList OUTPUT 

Вы должны сделать это до вызова sp_send_dbmail.

EXEC msdb.dbo.sp_send_dbmail 
@profile_name = 'Bob Jones', 
@recipients = @recipientList, 
@subject = 'Test email', 
@execute_query_database = 'Sales', 
@query = N'select * from sales', 
@attach_query_result_as_file = 1, 
@query_attachment_filename = 'Sales.txt' 

--EDIT--

Так как вы говорите, что вы не можете изменить хранимую процедуру, вы будете иметь, чтобы сделать что-то подобное использование FOR XML, чтобы создать список с ограничителями из набора результатов вашей процедуры ,

Этот код является 100% непроверенным, потому что нам не с чем работать, но оно должно быть довольно близко.

create table #EmailList 
(
    EmailAddress varchar(255) 
) 

insert #EmailList 
exec usp_emailRecipients 

declare @recipientList varchar(max) 

select @recipientList = STUFF((select ';' + EmailAddress 
from #EmailList 
FOR XML PATH('')), 1, 1, '') 

Тогда вы можете отправить электронное письмо, как я опубликовал выше.

+0

Спасибо за ваше предложение, но я не могу изменить хранимую процедуру. – rbhat

+0

@rbhatup см. Мое последнее редактирование. –

1

У вас есть возможность превратить процедуру usp_emailRecipients в скалярную функцию, скажем, udf_emailRecipients? Если это так, вы можете сделать следующее:

Declare @recipients as varchar(max) 
Select @recipients= udf_emailRecipients(); 

EXEC msdb.dbo.sp_send_dbmail 
@profile_name = 'Bob Jones', 
@recipients, 
@subject = 'Test email', 
@execute_query_database = 'Sales', 
@query = N'select * from sales', 
@attach_query_result_as_file = 1, 
@query_attachment_filename = 'Sales.txt' 
+0

Это будет работать, но скалярные функции, как известно, бедны с точки зрения производительности. –

+0

Спасибо за ваше предложение, но я не могу изменить хранимую процедуру. – rbhat