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

Set dbo.sp_send_dbmail arguments to stored procedure return value?

我有存储过程 usp_emailRecipients returns 一个以分号分隔的电子邮件地址列表。这是将接收使用 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'

谢谢。

按照您的编码方式,它将发送一个字符串文字作为收件人的值。这不是它的工作原理。这样做的方法是在 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, '')

然后你就可以像我上面发的那样发邮件了

您是否可以灵活地将 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'