0

我正在尝试将以下内容作为工作运行Sql Server Agent,但我没有收到电子邮件。

我认为我在 中表示表的方式有问题,inner join因为如果我用没有连接的简单查询替换查询,则任务有效。

EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'TEST_DEV',
    @recipients = 'xxx@gmail.com',
    @query = ' select 
            Percentage = CONVERT(DECIMAL(10,1),100 - (CAST(COUNT(DISTINCT case when PD.Exception  != ' ' then PD.Id  END) as float)/CAST(COUNT(PD.Id) as float)*100))
         from 
                DataBaseName.dbo.Product P INNER JOIN DataBaseName.dbo.LogProduct PD 
                ON P.LogId = PD.LogId

                WHERE   
                ResponseTime < GETDATE() and  RequestTime > DATEADD(MINUTE, -150, GETDATE())
                ' ,
    @subject = 'Test',
    @attach_query_result_as_file = 1 ;
4

3 回答 3

1

我确实注意到了格式问题。您需要使用 '' 来转义引号 '。这可能是您查询的第一个问题。

如果您安装了 Adventure Works,请从我的数据库邮件博客条目中运行以下查询。只需替换个人资料名称和收件人邮件地址。这将测试 sp_send_dbmail() 函数。

-- Send with query results as an attachment
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'The Public Profile',
@recipients = 'john@craftydba.com',
@query = 'SELECT COUNT(*) FROM AdventureWorks2008R2.Production.WorkOrder
WHERE DueDate > ''2006-04-30''
AND DATEDIFF(dd, ''2006-04-30'', DueDate) < 2' ,
@subject = 'Work Order Count',
@attach_query_result_as_file = 1 ;
GO

如果这确实有效,请在 SSMS 中测试您的查询以确保您获得结果。

于 2013-08-19T20:58:17.937 回答
1

我一直在我的@query 参数中使用连接而没有错误。您没有收到电子邮件的事实通常表明查询在运行时没有成功解析。

带有连接的查询是否直接在 SSMS 中运行?您可能会考虑创建一个变量@ResponseTime TYPE???并在 send_dbmail 之前设置变量的值,然后简单地传递该值以用 @ResponseTime 替换语法

于 2013-08-19T19:58:33.917 回答
0

以上两个答案都对我有帮助。我为解决我的问题所做的是,我使用存储过程而不是查询。它现在工作正常。

@query = 'exec DatabaseName.dbo.storedprocedure' 
于 2013-08-20T16:21:38.443 回答