使用curser发送多个DB邮件

时间:2018-10-29 14:19:02

标签: sql sql-server

我有一个表,其中包含ID,主题,结果和电子邮件列。我想发送主题和结果给用户。 我尝试使用波纹管代码执行此操作

Declare @ID INT

Declare Agent Cursor for
SELECT ID FROM myTable
GROUP BY ID


OPEN Agent 
FETCH NEXT FROM Agent INTO @ID

While (@@Fetch_Status = 0)
Begin

DECLARE @email NVARCHAR(MAX)
SET @email = (SELECT email FROM myTable
             WHERE ID = @ID)

DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT ID, Subject, Result FROM myTable  WHERE ID = ''@ID'''
--print EXEC @query
EXEC msdb.dbo.sp_send_dbmail 
    @profile_name='Reports',
    @recipients='my@email.com',
    @subject = 'Results',
    @body = '  ',
    @body_format = 'HTML',
    @query = @query,
    @query_result_header = 0,
    @exclude_query_output = 1,
    @append_query_error = 1,
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'qry.txt',
    @query_result_no_padding = 1


FETCH NEXT FROM Agent INTO @ID
end
CLOSE Agent
DEALLOCATE Agent

但是,当我执行此操作时,我没有任何错误。只收到一条告诉

的消息
  

命令成功完成

我找不到

  

邮件(编号:16)已排队。

通常应该伴随这种执行的消息。

此脚本中的错误在哪里?

2 个答案:

答案 0 :(得分:0)

您正在将@ID视为数字和字符串(我不知道它在“ myTable”中实际上是什么)-并且在首次执行sp_send_dbmail时可能会出现数据转换错误。

SET @email = (SELECT email FROM myTable
             WHERE ID = @ID)

SET @query = 'SELECT ID, Subject, Result FROM myTable  WHERE ID = ''@ID'''

尝试更改以上内容,将@ID视为数字。

SET @query = 'SELECT ID, Subject, Result FROM myTable  WHERE ID = @ID'

答案 1 :(得分:0)

大概,您希望查询包含ID。我想你想要

SET @query = REPLACE('SELECT ID, Subject, Result FROM myTable  WHERE ID = @ID', '@ID', @ID);

documentation中所述:

  

请注意,查询是在单独的会话中执行的,因此脚本中调用sp_send_dbmail的局部变量对查询不可用。