Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用send_dbmail为sql表中的每一行发送电子邮件_Sql_Sql Server_Sp Send Dbmail - Fatal编程技术网

使用send_dbmail为sql表中的每一行发送电子邮件

使用send_dbmail为sql表中的每一行发送电子邮件,sql,sql-server,sp-send-dbmail,Sql,Sql Server,Sp Send Dbmail,我很难弄清楚如何使send_dbmail在我的表中循环,并为每条记录发送一封新的电子邮件。每次运行此包时,我的表都会被删除并重新创建,有时它会有零条记录,有时它可能会有一些记录(从来没有任何重要的记录,总是

我很难弄清楚如何使send_dbmail在我的表中循环,并为每条记录发送一封新的电子邮件。每次运行此包时,我的表都会被删除并重新创建,有时它会有零条记录,有时它可能会有一些记录(从来没有任何重要的记录,总是<10)

当我只有一行时,这很好,但是当我添加第二行时,子查询失败,因为它不会产生唯一的结果,所以我的问题是,如何使它为可能存在的每一行发送单独的电子邮件,以及如何使它在没有行的情况下不发送消息

我必须通过文本正文格式发送,因为它被只支持文本的第三方邮件阅读器抓取

谢谢你的建议

use automationdb
declare @bodytext as nvarchar(max)

set @bodyText = ( SELECT 
N'%z_Curr_Contact_Number = 
%string1 = na
%string1 = na
%string2 = na
%zneed_by_date = '+ CONVERT(VARCHAR(20), dateadd(day,1,GETDATE()),100) + N'
' + '%Description=' + 'ID:  ' + isnull(id,'Unknown') +  N'
' + '%Description=' + 'Name:  ' + isnull(name,'Unknown') + N'
' + '%Description=' + 'Login:  ' + isnull(login,'Unknown') + N'
' + '%Description=' + 'Status:  ' + isnull(status,'Unknown') + N'
' + '%Description=' + 'Note One:  ' + isnull(note_one,'Unknown') + N'
' + '%Description=' + 'Role:  ' + isnull(role_id,'Unknown') + N'
' + '%Description=' + 'Role Name:  ' + isnull(role_name,'Unknown') + N'
' + '%Description=' + 'Location:  ' + isnull(Location,'Unknown') + N''

     FROM dbo.mpt)


EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'test',
@body = @bodyText,
@body_format ='TEXT',
@recipients = 'random@email.com',
@subject = 'send_dbmail test' ;
1) 您可以使用
LOCAL FAST\u FORWARD
读取每一行,然后执行
sp\u send\u dbmail

2) 您可以动态生成一条sql语句,其中包含EXEC sp_send_dbmail语句列表,如下所示:

DECLARE @SqlStatement NVARCHAR(MAX) = N'
    EXEC msdb.dbo.sp_send_dbmail @recipients=''dest01@domain.com'', ...; 
    EXEC msdb.dbo.sp_send_dbmail @recipients=''dest02@domain.com'', ...; 
    EXEC msdb.dbo.sp_send_dbmail @recipients=''dest03@domain.com'', ...;
    ...';
EXEC(@SqlStatement);


谢谢,上面后面的内容是避免使用光标的一个很好的解决方案。如何使@SQLStatement中的Exc数随表中的行数而变化,即如果表中有4行,则动态SQL中只有4个Exc?这可能吗?
DECLARE @bodyText NVARCHAR(MAX);
SET @bodyText = ...;

DECLARE @SqlStatement NVARCHAR(MAX) = N'
    EXEC msdb.dbo.sp_send_dbmail @recipients=''dest01@domain.com'', @body = @pBody, ...; 
    EXEC msdb.dbo.sp_send_dbmail @recipients=''dest02@domain.com'', @body = @pBody, ...; 
    EXEC msdb.dbo.sp_send_dbmail @recipients=''dest03@domain.com'', @body = @pBody, ...; 
    ...';
EXEC sp_executesql @SqlStatement, N'@pBody NVARCHAR(MAX)', @pBody = @bodyText;