【问题标题】:sp_send_dbmail fails with attachmentsp_send_dbmail 失败并带有附件
【发布时间】:2018-06-14 13:39:50
【问题描述】:

我需要发送带有文件附件的电子邮件。附件必须来自图像类型数据字段。在查询窗口和存储过程中运行以下代码时,不会发送电子邮件。在查询窗口中,它只是说“命令已成功完成”,但没有电子邮件。

EXEC  msdb.dbo.sp_send_dbmail @recipients = 'xx@xx.com',
    @subject = 'test',
    @execute_query_database = 'myDB',
    @body = 'test',
    @body_format = 'HTML', 
    @profile_name = 'myProfile',
    @append_query_error = 1,
    @query = 'Select docData from [myDB].[dbo].[Documents] Where id = 1',
    @query_result_header = 0,
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'Test.doc',
    @exclude_query_output = 1,
    @query_no_truncate = 1;

当我删除@query 时发送电子邮件:

EXEC  msdb.dbo.sp_send_dbmail @recipients = 'xx@xx.com',
    @subject = 'test',
    @execute_query_database = 'myDB',
    @body = 'test',
    @body_format = 'HTML', 
    @profile_name = 'myProfile';

但我需要附件代码才能工作。任何帮助将不胜感激。

【问题讨论】:

    标签: sql-server sql-server-2012


    【解决方案1】:

    评论太长了。

    @exclude_query_output = 0 更改为@exclude_query_output = 1。这可能会打印一条关于正在发生的事情的消息(错误消息)。

    在您的示例中,我能够绕过错误:

    无法初始化 sqlcmd 库,错误号为 -2147024809。

    我知道了,我希望您可以通过将@query_result_header = 0 更改为@query_result_header = 1 来获得。我不确定为什么缺少标头会导致它失败,但它在我的开发盒上修复了它。

    【讨论】:

    • 谢谢。我将 @exclude_query_output 值更改为 0,并显示更多描述性错误消息,表明文件大小已超出限制。所以我在这篇文章的帮助下增加了它,现在我可以发送附件电子邮件:增加电子邮件的文件大小限制:stackoverflow.com/questions/997628/…
    【解决方案2】:

    在我的情况下,而不是这个:

    SET @Send_Query_Text = 
    'SELECT Message_Text FROM DataMonitoring.Alert_Message WHERE Message_Setup_Key =' + CAST( @Message_Setup_Key AS VARCHAR(10)) + ' AND Mailing_GUID = ''' + CAST(@Mailing_GUID AS VARCHAR(36))+'''';
    

    我应该这样做的:

    SET @Send_Query_Text = 
        'SELECT Message_Text FROM Staging_Area.DataMonitoring.Alert_Message WHERE Message_Setup_Key =' + CAST( @Message_Setup_Key AS VARCHAR(10)) + ' AND Mailing_GUID = ''' + CAST(@Mailing_GUID AS VARCHAR(36))+'''';
    

    如您所见,查询应包含数据库,否则将不起作用

    【讨论】:

    • 在此处添加数据库名称是关键。谢谢你帮助我!
    【解决方案3】:

    我遇到了同样的问题,但我找到的解决方案都没有帮助。最后MSSQLTips 引导我走向正确的方向。运行分析器我收到以下错误消息:

    无法获取有关 Windows NT 组/用户的信息 “域\用户”,错误代码 0x5

    检查windows安全事件日志中的Audit Failures 我终于找到了原因:

    指定帐户的密码已过期。

    运行 SQL Server 和 SQL Server 代理的活动目录帐户已设置为允许密码过期。禁用 AD 帐户的密码过期立即解决了该问题。

    【讨论】:

    • 检查 Profiler 的建议有所帮助。我的尝试返回查询结果。就我而言,我并没有完全限定数据库,直到我在跟踪日志中看到它才不清楚。
    【解决方案4】:

    我将在这里添加另一个选项。我尝试了上面的建议无济于事。拆开我的脚本后,我发现我的 SQL 中缺少一个前缀。而不是语法错误,我收到了与其他人相同的错误。一旦我修复了 SQL,它就可以工作了。

    【讨论】:

      【解决方案5】:

      确保您的查询采用以下格式:

      [Database].[Schema].[Table] name
      

      这已经帮我解决了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 2013-11-01
        • 1970-01-01
        相关资源
        最近更新 更多