SQL查询结果以邮件 - 接收错误格式化查询,可能是无效参数错误

时间:2016-09-23 02:05:19

标签: sql-server tsql

我正在尝试将无效代码发送到邮件。但是,当我执行存储过程的作业时,它已完成,并且没有发送任何电子邮件。当我单独执行查询时,我得到了结果。我错过了任何配置设置吗?

CREATE PROCEDURE sp_Send_Email_Invalid_code 
    @MONTH AS int = 0
AS
BEGIN
    DECLARE @Email_Subject AS nvarchar(250) = 'Codes Missing in master table';
    DECLARE @Email_Receipients_To AS nvarchar(max) = 'xxx.yyy.com';
    DECLARE @IsUseEmailConfig AS bit = 1;
    DECLARE @Email_Category AS nvarchar(250);

    SET @IsUseEmailConfig = 0
    SET @Email_Category = 'Codes Missing in master table'

    SELECT DISTINCT CODE 
    INTO #temp_1
    FROM tblRegCode nolock

    SELECT
        *
    FROM 
        #temp_1

    DECLARE @Query nvarchar(max);
    SET @Query = 'SELECT * FROM #temp_1';

    EXEC msdb.dbo.sp_send_dbmail 
              @profile_name = 'psmEmailer',  
              @recipients = 'xxx.yyy.com',
              @query = @Query,  
              @subject = 'Missing codes', 
              @attach_query_result_as_file = 1 ;

    DROP TABLE #temp_1;
END

我的SQL Server代理作业是

 DECLARE @MONTH AS int = 0
 DECLARE @dt datetime = GETDATE()

 SET @MONTH = DATEPART(mm, DATEADD(mm, -1, @dt))

 EXEC sp_Send_Email_Invalid_code @MONTH

2 个答案:

答案 0 :(得分:1)

所以,你可以通过你的SP制作:

CREATE PROCEDURE sp_Send_Email_Invalid_code 
    @MONTH AS int 
AS
BEGIN

    DECLARE @Query nvarchar(max) = 'SELECT [CODE ] FROM tblRegCode nolock';

    EXEC msdb.dbo.sp_send_dbmail 
                            @profile_name = 'psmEmailer',  
                            @recipients = 'xxx.yyy.com',
                            @query = @Query,  
                            @subject = 'Codes Missing in master table', 
                            @attach_query_result_as_file = 1 ;

END
GO

在SP中你没有使用@MONTH,为什么?

尝试在SP中添加WITH EXECUTE AS OWNER,然后通过作业运行。

答案 1 :(得分:1)

这很难回答,因为上面的代码中没有任何明显的问题可以解决问题。因此问题必须在哪里。我的想法是1)你的查询结果集没有返回任何东西。 2)您的电子邮件配置正确,这意味着无法发送电子邮件。

对于数字1,我​​们无法在不检查您的数据的情况下解决此问题,因此请继续。

对于数字2,尝试单独使用发送邮件过程从SQL实例发送简单的电子邮件。像这样:

EXEC msdb.dbo.sp_send_dbmail 
    @recipients = 'you@somewhere.com',
    @subject = 'Send Mail Test',
    @body = 'Testing',
    @body_format = 'HTML'; 

然后,您没有收到电子邮件,请使用以下查询检查MSDB中的故障日志。

USE [msdb]
GO

SELECT 
    l.[description] AS 'Error failure',
    f.[recipients],
    f.[subject],
    f.[sent_date],
    f.[body],
    f.[body_format]
FROM 
    [dbo].sysmail_faileditems f
    JOIN [dbo].sysmail_event_log l
        ON f.[mailitem_id] = l.[mailitem_id]
ORDER BY
    f.[sent_date] DESC

如果您收到了测试电子邮件,我建议问题在于您尝试附加的查询结果。

只是另一个想法。您可能还需要使用参数 @execute_query_database @query_attachment_filename

查看https://msdn.microsoft.com/en-us/library/ms190307.aspx了解详情。