Édgar, parte de este gran equipo de trabajo, nos hizo el favor de redactar este escrito ya que domina muy bien el tema.
Solución:
El código de error 101 se debe a que el archivo adjunto del resultado de la consulta es más grande que la opción de configuración del correo electrónico de la base de datos “MaxFileSize”.
Investigación
Mi primer intento de resolver esto fue ejecutar sp_helpttext
sobre el sp_send_dbmail
procedimiento para ver la implementación:
EXEC sp_helptext 'sp_send_dbmail';
El cuerpo principal de ese procedimiento devuelve un montón de códigos de estado diferentes, desde 0 hasta 21. No menciona 101. Sin embargo, llama a algunos otros procedimientos almacenados, como sysmail_verify_profile_sp
así que miré en ese:
EXEC sp_helptext 'sysmail_verify_profile_sp';
Pero eso solo devuelve códigos de 0 a 4.
Más tarde, el proceso llama a sysmail_verify_addressparams_sp
vamos a ver:
EXEC sp_helptext 'sysmail_verify_addressparams_sp';
Shucks, eso solo devuelve 0 o 1.
el siguiente es sp_RunMailQuery
:
EXEC sp_helptext 'sp_RunMailQuery';
llama sysmail_help_configure_value_sp
y sp_isprohibited
los cuales solo devuelven 0 o 1.
Caja negra
al final de sp_RunMailQuery
un procedimiento almacenado extendido del sistema se llama: xp_sysmail_format_query
.
No podemos obtener el código fuente para esto, pero tuve una corazonada al principio del proceso:
--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
Me di cuenta de que está utilizando el parámetro adjunto, y los resultados de la consulta + el tamaño máximo del archivo también pasan al procedimiento almacenado extendido.
ciudad repro
Configuré el tamaño máximo de archivo de mi correo de base de datos en 10 bytes y luego ejecuté:
DECLARE @result AS INT;
exec @result = msdb.dbo.sp_send_dbmail
@profile_name = 'DBMail',
@recipients = '[email protected]',
@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;
Nota: la tabla “sys.messages” tiene un montón de string datos que sabía serían más de 10 bytes.
Y efectivamente, obtuve 101 como código de retorno:
Bugz
Como señaló amablemente CR241, la documentación dice que @@ERROR debe contener el número de identificación de error que corresponde al mensaje de error apropiado en el sys.messages
mesa:
El código de error de la declaración que falló se almacena en la variable @@ERROR. – sp_send_dbmail – Valores de código de retorno
En cambio, es 0 en mi prueba (que anotó en su pregunta original). Esto me parece un error.