我正在尝试将以下内容作为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 ;
答案 0 :(得分:1)
我一直在@query参数中使用连接而没有错误。您未收到电子邮件的事实通常表明查询在运行时未成功解析。
带有连接的查询是否直接在SSMS中运行?你可以考虑创建一个变量@ResponseTime TYPE ???并在send_dbmail之前设置Variable的值,然后在使用@ResponseTime替换语法时简单地传递该值
答案 1 :(得分:1)
我确实注意到了格式问题。你需要使用''来逃避报价'。这可能是您查询的第一个问题。
如果安装了Adventure Works,请从我的数据库邮件blog条目运行以下查询。只需替换配置文件名称和收件人邮件地址即可。这将测试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中测试您的查询,以确保获得结果。
答案 2 :(得分:0)
上述答案都对我有所帮助。我解决我的问题所做的是,我使用存储过程而不是查询。现在工作正常。
@query = 'exec DatabaseName.dbo.storedprocedure'