首页 > 解决方案 > 使用curser发送多个数据库邮件

问题描述

我有一个包含 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

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

命令成功完成

我无法得到

邮件(ID:16)排队。

通常应与这种处决一起出现的消息。

这个脚本的错误在哪里?

标签: sqlsql-server

解决方案


您将@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'

推荐阅读