you*_*gme 5 sql-server database-mail
我有一封电子邮件失败,函数返回值为“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;
Run Code Online (Sandbox Code Playgroud)
Jos*_*ell 11
错误代码 101 是因为您的查询结果附件大于“MaxFileSize”数据库邮件配置选项。
我在搞清楚了这一点的第一次尝试是运行sp_helpttext的sp_send_dbmail过程来看看实现:
EXEC sp_helptext 'sp_send_dbmail';
Run Code Online (Sandbox Code Playgroud)
该过程的主体返回一堆不同的状态代码,从 0 到 21。它没有提到 101。但是,它调用了其他一些存储过程,例如sysmail_verify_profile_sp,所以我看了一眼:
EXEC sp_helptext 'sysmail_verify_profile_sp';
Run Code Online (Sandbox Code Playgroud)
但这仅返回从 0 到 4 的代码。
稍后 proc 调用到sysmail_verify_addressparams_sp,让我们检查一下:
EXEC sp_helptext 'sysmail_verify_addressparams_sp';
Run Code Online (Sandbox Code Playgroud)
糟糕,只返回 0 或 1。
接下来是sp_RunMailQuery:
EXEC sp_helptext 'sp_RunMailQuery';
Run Code Online (Sandbox Code Playgroud)
它调用sysmail_help_configure_value_spand sp_isprohibited,两者都只返回 0 或 1。
在 的末尾sp_RunMailQuery,调用了一个系统扩展存储过程:xp_sysmail_format_query。
我们无法为此获取源代码,但我在 proc 的早期有一个预感:
--Get the maximum file size allowed for attachments from sysmailconfig.
EXEC msdb.dbo.sysmail_help_configure_value_sp @parameter_name = N'MaxFileSize',
@parameter_value = @fileSizeStr OUTPUT
Run Code Online (Sandbox Code Playgroud)
我注意到您正在使用附件参数,并且查询结果 + 最大文件大小也都传递到扩展存储过程中。
我将数据库邮件最大文件大小设置为 10 字节,然后运行:
DECLARE @result AS INT;
exec @result = msdb.dbo.sp_send_dbmail
@profile_name = 'DBMail',
@recipients = 'myemailaddress@something.com',
@subject = 'This is the subject',
@body = 'This is the body',
@body_format='html',
@query = 'SELECT * FROM sys.messages;',
@exclude_query_output = 1,
@attach_query_result_as_file = 1,
@query_attachment_filename = 'big-file.csv',
@query_result_separator = '===',
@query_result_header = 1;
SELECT @result;
Run Code Online (Sandbox Code Playgroud)
注意:“sys.messages”表有一堆字符串数据,我知道这些数据会超过 10 个字节。
果然,我得到了 101 作为返回码:
正如CR241 有帮助地指出的那样,文档说@@ERROR 应该包含与sys.messages表中相应错误消息相对应的错误 ID 号:
失败语句的错误代码存储在@@ERROR 变量中。- sp_send_dbmail - 返回代码值
相反,它在我的测试中为 0(您在原始问题中指出)。这对我来说似乎是一个错误。