使用sp_send_dbmail加入

时间:2013-08-19 19:34:33

标签: sql-server tsql sql-server-2008-r2 sql-agent-job sql-job

我正在尝试将以下内容作为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 ;

3 个答案:

答案 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' 
相关问题