sp_send_dbmail带附件失败

7

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

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';

但我需要附件代码起作用。任何帮助将不胜感激。

5个回答

11

评论太长了。

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

在您的示例中,我能够解决错误:

  

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

我得到了一个错误,而且我预计您更改@query_result_header = 0@query_result_header = 1也可能会遇到同样的错误。我不确定为什么缺少标题会导致它失败,但是在我的开发框中可以解决它。


2
谢谢。我将@exclude_query_output的值更改为0,同时添加了更详细的错误消息以指示文件大小限制已超过。通过这篇文章的帮助,我增加了邮件的文件大小限制,并现在可以发送带附件的电子邮件:增加电子邮件附件大小限制:https://dev59.com/enNA5IYBdhLWcg3wWsYA。 - dars

3
在我的情况下,与此相反:
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))+'''';

正如您所看到的,查询应该包含数据库,否则它将无法工作


1
在这里添加数据库名称是关键。感谢您的帮助! - visch

1
我遇到了同样的问题,但是我找到的所有解决方案都没有帮助。最终MSSQLTips带领我找到了正确的方向。运行Profiler后,我得到了以下错误消息:
无法获取有关Windows NT组/用户“DOMAIN\user”的信息,错误代码为0x5
检查Windows安全事件日志中的审核失败,我终于找到了原因:
指定帐户的密码已过期。
SQL Server和SQL Server Agent运行的活动目录帐户已设置允许密码过期。禁用AD帐户上的密码过期立即解决了该问题。

检查 Profiler 的建议很有帮助。我的代码试图返回查询结果。在我的情况下,我没有完全指定数据库的限定名称,直到我在跟踪日志中看到了这一点才变得清晰明了。 - InbetweenWeekends

1

我在这里提供另一个选项。我尝试了上面的建议,但没有成功。在拆开我的脚本后,我发现我的SQL语句中缺少前缀。由于这个问题,我收到了和其他人一样的错误信息,而不是语法错误。一旦我修复了SQL语句,它就可以正常运行了。


0

请确保您的查询格式正确:

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

这个对我有用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接