将 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'
我有存储过程 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'