【问题标题】:SQL query results to mail- Receiving Error formatting query, probably invalid parameters errorSQL查询结果到邮件-接收错误格式化查询,可能是无效参数错误
【发布时间】:2017-06-05 03:54:28
【问题描述】:

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

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

【问题讨论】:

  • 您的程序未发送电子邮件。也许您的意思是包含msdb..sp_send_dbmail 或其他内容?
  • 不要为 MySQL 和 SQL Server 使用标签,它们适用于不同的产品。这只会让看问题的人感到困惑。 EXEC msdb.dbo.sp_send_dbmail 是一个 SQL Server 过程。

标签: sql-server tsql


【解决方案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了解详情。

【讨论】:

  • 谢谢保罗。我使用了@append_query_error=1 参数并发现我的查询存在问题 DECLARE @Query nvarchar(max); SET @Query='SELECT * FROM #temp_1'
  • 无效的对象 #temp_1。所以我使用直接表名代替 temp,现在一切正常
  • 太好了,如果我的回答有帮助并解决了问题,请投票并将其标记为已接受的答案。谢谢
【解决方案2】:

所以,你可以从你的 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,并通过作业运行它。

【讨论】:

  • 一个注意事项:你可以使用#temp_1这样的表SET @Query='USE TempDB; SELECT * FROM #temp_1';
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
相关资源
最近更新 更多