代码之家  ›  专栏  ›  技术社区  ›  GihanDB

使用游标发送多个数据库邮件

  •  0
  • GihanDB  · 技术社区  · 7 年前

    我有一个表,其中有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)已排队。

    这种处决通常会带来的信息。

    这个脚本中的错误在哪里?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Dave Brown    7 年前

    您将@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'
    
        2
  •  0
  •   Gordon Linoff    7 年前

    您可能希望查询包含id。我想您希望:

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

    正如在 documentation :

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