将dbo.sp_send_dbmail参数设置为存储过程返回值?

时间:2016-05-17 16:37:09

标签: sql-server sql-server-2008 tsql stored-procedures sp-send-dbmail

我有存储过程usp_emailRecipients,它返回以分号分隔的电子邮件地址列表。这是将收到使用msdb.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'

感谢。

2 个答案:

答案 0 :(得分:1)

您对此进行编码的方式将发送字符串文字作为收件人的值。这不是这个工作原理。这样做的方法是在usp_emailRecipients中使用OUTPUT变量。这将需要更改您的过程,以便您使用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'

- 编辑 -

由于您说您无法修改存储过程,因此您将不得不执行类似于使用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, '')

然后您可以发送我上面发布的电子邮件。

答案 1 :(得分: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'