我有一封电子邮件失败,函数返回值为“101”,@@error 值为“0”(未添加任何行sysmail_allitems
)。
我在哪里可以找到有关此函数的返回代码的文档?
显示我如何获得上述值的示例代码:
exec @result = msdb.dbo.sp_send_dbmail
@profile_name = 'OBFUSCATED',
@recipients = @DL,
@subject = 'OBFUSCATED',
@body = @emailBody,
@body_format='html',
@query = @reportQuery,
@exclude_query_output = 1,
@attach_query_result_as_file = 1,
@query_attachment_filename = @filename,
@query_result_separator = @temp,
@query_result_header = 1,
@mailitem_id = @mailitem_id
;
set @temp = @@ERROR;
错误代码 101 是因为您的查询结果附件大于“MaxFileSize”数据库邮件配置选项。
调查
我第一次尝试解决这个问题是运行
sp_helpttext
该sp_send_dbmail
过程以查看实现:该过程的主体返回一堆不同的状态码,从 0 到 21。它没有提到 101。但是,它调用了其他一些存储过程,比如
sysmail_verify_profile_sp
,所以我看了一眼:但这只会返回 0 到 4 的代码。
稍后 proc 调用到
sysmail_verify_addressparams_sp
,让我们检查一下:嘘,只返回 0 或 1。
接下来是
sp_RunMailQuery
:它调用
sysmail_help_configure_value_sp
andsp_isprohibited
,两者都只返回 0 或 1。黑盒子
在结束时
sp_RunMailQuery
,调用了一个系统扩展存储过程:xp_sysmail_format_query
。我们无法获取此源代码,但我从 proc 的前面有一个预感:
我注意到您正在使用附件参数,并且查询结果 + 最大文件大小也都被传递到扩展存储过程中。
复制城
我将我的数据库邮件最大文件大小设置为 10 字节,然后运行:
注意:“sys.messages”表有一堆我知道会超过 10 个字节的字符串数据。
果然,我得到了 101 作为返回码:
虫虫
正如CR241 有用地指出的那样,文档说@@ERROR 应该包含与表中相应错误消息相对应的错误 ID 号
sys.messages
:相反,它在我的测试中为 0(您在原始问题中指出)。这对我来说似乎是一个错误。
根据sp_send_dbmail
返回代码值:
失败语句的错误代码存储在
@@ERROR
变量中。sp_send_dbmail()
0
如果可以无错误地启动发送邮件的过程,则返回。这意味着,已在数据库邮件队列中设置了邮件,并且对于每封邮件,mailitem_id
都在结果集中返回消息的 for。0
除了表示错误之外的任何返回值。失败语句的准确错误代码可以在 中查看@@ERROR
。使用后
sp_send_dbmail()
,邮件是异步发送的,仍然可能由于多种原因而失败。所以如果sp_send_dbmail()
返回0
,并不代表最终成功。您可能会在
msdb.dbo.sysmail_faileditems
错误的情况下查看。